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

07-24 18:45
查看更多