Parse.com 查询太慢,需要更快
Parse.com query is too slow and needs to be faster
我的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
class的示例实现:
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
class:
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;
}
}
我的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
class的示例实现:
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
class:
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;
}
}