Parse.com 查询太慢,需要更快

Parse.com query is too slow and needs to be faster

我的Parse.com查询太慢了,下面的代码是1个网络调用。因此我想并行执行 3 个查询:

  1. 查询行 0 - 200
  2. 查询第 201 - 400 行
  3. 查询第 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);
}

FetchParseQueryTaskclass的示例实现:

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;
  }
}