Android 使用OnQueryTextListener刷新AsyncTaskLoader的查询

Android 使用OnQueryTextListener刷新AsyncTaskLoader的查询,android,asynctaskloader,Android,Asynctaskloader,我有一个自定义AsyncTaskLoader,它根据输入到ActionBar搜索中的一些查询文本执行搜索: class SearchLoader extends AsyncTaskLoader<List<String>> { private static final String TAG = SearchLoader.class.getName(); private List<String> data; private String

我有一个自定义AsyncTaskLoader,它根据输入到ActionBar搜索中的一些查询文本执行搜索:

class SearchLoader extends AsyncTaskLoader<List<String>> {

    private static final String TAG = SearchLoader.class.getName();

    private List<String> data;
    private String query;
    private DataStore dataStore;

    public SearchLoader(Context context, DataStore dataStore, String query) {
        super(context);
        this.dataStore = dataStore;
        this.query = query;
    }

    @Override
    public List<String> loadInBackground() {
        try {
            return dataStore.find(query);
        } catch (SearchException e) {
            Log.e(TAG, String.format("Error performing search, query: %s", query), e);
        }

        return null;
    }
}
我知道我需要调用getLoaderManager().restartLoader

然而,我不确定的是如何在加载器本身上设置新的查询文本

  • 我没有访问加载器实例以调用setter的权限
  • 据我所知,restartLoader的参数仅在需要创建新加载程序时使用

  • 推荐的方法是什么?

    根据我的经验,
    restartLoader()
    会导致调用
    onCreateLoader()
    。我不知道为什么会这样,因为它似乎与文档中关于重用现有装载机的内容相反。您的代码已经将保存的查询实例变量传递给加载器构造函数,因此它应该执行您想要的操作


    Google显示了在查询文本更改时调用
    restartLoader()

    私有LoaderManagerImpl类对这两个方法的Javadoc注释略有不同,这实际上更好地描述了发生的情况。特别是,对于restartLoader(),它表示“调用以重新创建与特定ID关联的加载程序。如果当前存在与此ID关联的加载程序,则将根据需要取消/停止/销毁该加载程序。将创建具有给定参数的新加载程序,并在可用时将其数据传递给您。”
    @Override
    public boolean onQueryTextChange(String newText) {
        query = !TextUtils.isEmpty(newText) ? newText : null;
        getLoaderManager().restartLoader(SEARCHRESULTS_LOADER, null, this);
        return false;
    }