【问题标题】:Refreshing query of AsyncTaskLoader with OnQueryTextListener使用 OnQueryTextListener 刷新 AsyncTaskLoader 的查询
【发布时间】:2014-03-06 04:41:46
【问题描述】:

我有一个自定义 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;
    }
}

我已经连接了一个 OnQueryTextListener 以在查询更改时通过执行新搜索来刷新加载器的数据:

@Override
public boolean onQueryTextChange(String newText) {
    query = !TextUtils.isEmpty(newText) ? newText : null;
    getLoaderManager().restartLoader(SEARCHRESULTS_LOADER, null, this);
    return false;
}

我知道我需要调用 getLoaderManager().restartLoader。

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

  1. 我无权访问加载器实例来调用 setter
  2. 据我所知,restartLoader 的参数仅在需要创建新加载程序时使用

推荐的方法是什么?

【问题讨论】:

    标签: android asynctaskloader


    【解决方案1】:

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

    来自 Google 的This Android sample 显示当查询文本更改时会调用restartLoader()

    【讨论】:

    • 私有 LoaderManagerImpl 类对这两种方法的 Javadoc 注释略有不同,实际上更好地描述了正在发生的事情。特别是,对于restartLoader(),它表示“调用以重新创建与特定ID关联的Loader。如果当前有与该ID关联的Loader,它将酌情取消/停止/销毁。一个新的Loader将创建给定的参数,并在可用时将其数据交付给您。”
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多