扩展 LoaderManager - 如何实现 "publishProgress"?

Extending LoaderManager - How to implement "publishProgress"?

假设我有一个非常简单的长 运行 任务作为 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;
   }
}

我有一个 activity 实现 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 的全部目的是在 Context/Orientation 更改时不必使用引用 - 然而,使用 publishProgress 我能想到的唯一方法是传递 Handler 进入我的 DumbLoader 然后通知我。这是一种安全的方法吗?有更好的方法吗?

编辑:我的例子可能有点误导。如果有两个单独的函数,它们都 return 我的 "final" 结果的值,我可以轻松地为每个函数单独调用 AsyncTaskLoader。我修改它以可视化数据"published"可以与最终结果不同(在这个例子中,我想知道数据的大小,而不是数据)。

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

中关闭它

however, with publishProgress the only way I can think of is passing a Handler into my DumbLoader which then notifies me. Is this a safe way? Are there better ways?

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