想象一下,我有一个非常简单的长期运行任务作为AsyncTaskLoader:
public class DumbLoader extends AsyncTaskLoader{
private static final String TAG = "DumbLoader";
public DumbLoader(Context context) {
super(context);
}
@Override
public List<String> loadInBackground() {
List<String> allData = new ArrayList<>();
List<String> someData = DummyData.getItems();
notify(someData.size()) ;// publish amount of elements of someData
List<String> someOtherData = DummyData.getSomeOtherItems();
notify(someOtherData.size()); //publish amount of elements of someOtherData
allData.addAll(someData);
allData.addAll(someOtherData);
return allData;
}
}
我有一个实现LoaderCallbacks的活动:
@Override
public Loader<List<String> onCreateLoader(int i, Bundle bundle) {
return new DumbLoader(this);
}
@Override
public void onLoadFinished(Loader<String> dummyLoader, List<String> result) {
// do something with result
}
@Override
public void onLoaderReset(Loader<String> dummyLoader) {
}
您如何实现类似AsyncTask的publishProgress
?
使用LoaderManager
的全部目的是在上下文/方向更改时不必使用引用 - 但是,使用publishProgress我能想到的唯一方法是将Handler
传递给我的DumbLoader然后通知我。这是一种安全的方式吗?还有更好的方法吗?
编辑:我的例子可能有点误导。如果有两个单独的函数都返回我的“最终”结果的值,我可以轻松地为每个函数单独调用AsyncTaskLoader。我修改它以可视化“已发布”的数据可能与最终结果不同(在此示例中,我想知道数据的大小,但不知道数据)。
答案 0 :(得分:1)
对于这个用例,indeterminate ProgressBar
在我看来是显而易见的选择。我会在调用onCreateLoader
时将其实例化,并在onLoadFinished
然而,使用publishProgress我能想到的唯一方法就是传递一个 处理器进入我的DumbLoader然后通知我。这是一种安全的方式吗? 还有更好的方法吗?
我会使用LocalBroadcastManager
。意图将仅在您的应用中广播。在您的Activity / Fragment中注册BroadcastReceiver
并在调用onReceiver时更新进度。 BroadcastReceiver
的好处是它始终在ui线程上运行