扩展LoaderManager - 如何实现“publishProgress”?

时间:2015-11-10 07:53:13

标签: android android-asynctask android-loadermanager

想象一下,我有一个非常简单的长期运行任务作为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。我修改它以可视化“已发布”的数据可能与最终结果不同(在此示例中,我想知道数据的大小,但不知道数据)。

1 个答案:

答案 0 :(得分:1)

对于这个用例,indeterminate ProgressBar在我看来是显而易见的选择。我会在调用onCreateLoader时将其实例化,并在onLoadFinished

中将其关闭
  

然而,使用publishProgress我能想到的唯一方法就是传递一个   处理器进入我的DumbLoader然后通知我。这是一种安全的方式吗?   还有更好的方法吗?

我会使用LocalBroadcastManager。意图将仅在您的应用中广播。在您的Activity / Fragment中注册BroadcastReceiver并在调用onReceiver时更新进度。 BroadcastReceiver的好处是它始终在ui线程上运行