我已经将我的AsyncTask
转换为AsyncTaskLoader
(主要是为了处理配置更改)。我有一个TextView
用作进度状态,并且正在onProgressUpdate
中使用AsyncTask
对其进行更新。看起来AsyncTaskLoader
不具有等效项,因此在loadInBackground
(在AsyncTaskLoader
中)期间,我使用的是:
getActivity().runOnUiThread(new Runnable() {
public void run() {
((TextView)getActivity().findViewById(R.id.status)).setText("Updating...");
}
});
我正在Fragment
中使用它,这就是为什么我正在使用getActivity()
。这很好用,除非发生配置更改(例如更改屏幕方向)。我的AsyncTaskLoader
保持运行状态(这就是为什么我使用AsyncTaskLoader
的原因),但是runOnUiThread
似乎被跳过了。
不确定为什么要跳过它,或者这是否是从AsyncTaskLoader
更新UI的最佳方法。
更新:
我最终恢复为AsyncTask
,因为它似乎更适合UI更新。希望他们可以将AsyncTask
的有效内容与AsyncTaskLoader
合并。
实际上是可能的。本质上,您需要对AsyncTaskloader
进行子类化并实现publishMessage()
方法,该方法将使用Handler
将进度消息传递给实现ProgressListener
(或您要调用的任何接口)的任何类。 >
下载此示例:http://www.2shared.com/file/VW68yhZ1/SampleTaskProgressDialogFragme.html(如果离线,请通知我)-基于http://habrahabr.ru/post/131560/
嗯...你不应该这样做。
回答我自己的问题,但据我所知,如果需要更新UI,AsyncTaskLoader
不是最好的选择。
在实现LoaderManager.LoaderCallback
的类(可能是您的Activity)中,有一个onLoadFinished()
方法必须重写。这是AsyncTaskLoader
完成加载后返回的内容。
最好的方法是使用LiveData,100%正常工作