我的Parse.com查询速度太慢,下面的代码是1个网络调用。因此,我想并行执行3个查询:
查询行0-200
查询行201-400
查询行401-500
这是当前代码:
public static void readBusShelters() {
ParseQuery<ParseObject> query = ParseQuery.getQuery(BusShelter.TABLE_NAME);
query.setLimit(500);
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> list, ParseException e) {
}
});
}
一些帮助将不胜感激!
最佳答案
将解析查询包装在带有回调的AsyncTask
中,然后在线程池上执行以使任务能够并行运行。
例:
public class MainActivity extends AppCompatActivity implements OnTaskCompleted {
@Override
public void onTaskCompleted(List<ParseObject> response) {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
new FetchParseQueryTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new PagingOptions(0, 200));
new FetchParseQueryTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new PagingOptions(1, 200));
new FetchParseQueryTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new PagingOptions(2, 200));
}
}
回调:
public interface OnTaskCompleted {
void onTaskCompleted(List<ParseObject> response);
}
FetchParseQueryTask
类的示例实现:public class FetchParseQueryTask extends AsyncTask<PagingOptions, Void, List<ParseObject>> {
private OnTaskCompleted mTaskCompleted;
public FetchParseQueryTask(OnTaskCompleted activityContext){
mTaskCompleted = activityContext;
}
@Override
protected List<ParseObject> doInBackground(PagingOptions... params) {
PagingOptions pagingOptions = params[0];
ParseQuery<ParseObject> query = ParseQuery.getQuery("TABLE_NAME");
query.setLimit(pagingOptions.getLimit());
query.setSkip(pagingOptions.getPage() * pagingOptions.getLimit());
try {
return query.find();
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(List<ParseObject> result) {
super.onPostExecute(result);
if (mTaskCompleted != null) {
mTaskCompleted.onTaskCompleted(result);
}
}
}
PagingOptions
类:public class PagingOptions {
private int mPage;
private int mLimit;
public PagingOptions(int page, int limit)
{
mPage = page;
mLimit = limit;
}
public int getPage() {
return mPage;
}
public void setPage(int mPage) {
this.mPage = mPage;
}
public int getLimit() {
return mLimit;
}
public void setLimit(int mLimit) {
this.mLimit = mLimit;
}
}