扩展 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 线程上运行
假设我有一个非常简单的长 运行 任务作为 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 线程上运行