我正在AsyncTask
做后台工作并填充ListView
它onProgressUpdate
并调用notifyDataSetChanged()
适配器。问题是当方向改变时,AsyncTask
停止。无论如何,我怎样才能AsyncTask
继续做它的工作并填充结果?ListView
我不能使用android:configChanges="keyboardHidden|orientation"
,因为我的布局在横向模式下是不同的。我也尝试使用Service
类,但我无法访问我的 UI 组件。实现我所追求的最简单的方法是什么?
问问题
353 次
1 回答
1
您可以使用回调方法来更新您的 listView。你需要在你的 AsyncTask 中实现它,如果直接从你的 doInBackground 或 onProgressUpdate 调用:
private updateListViewListener mListener;
public interface updateListViewListener{
void updateListView(List<String> rowsData);
}
public void setUpdateListViewListener(updateListViewListener listener) {
mListener = listener;
}
然后在 doInBackGround(或 onPogressUpdate)中:
@Override
protected Object doInBackground(Object... arg0) {
//Code that downloads data or executes time consumming code that calls the following interface when the data of a row is ready
mListener.updateListView(listOfStrings);
}
然后在您的活动中,您可以将 AsyncTask 的引用保存在另一个类中:
RandomClass.saveAsyncTask(yourAsynctask);
这样,即使重新创建了活动,您也可以获得对 AsyncTask 的引用,在 oncreateView() 上添加类似这样的内容:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
YourAsyncTask task = RandomClass.getAsyncTask();
if(task != null){
newAsyncTask = task;
newAsyncTask .setUpdateListViewListener(this); // you set again the listener
}
}
最后,您可以将其添加到您将在活动中覆盖的 updateListView 方法中:
@Override
public void updateListView(List<String> newDataFromAT) {
adapter.setData(newDataFromAT);
// You need to do this since you can't change anything in the UI from doInBakcground
getActivity().runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
}
这只是一些我认为对你有用的代码,因为你没有发布任何代码,但你知道当你旋转你的设备时,AsyncTask 不能更新像 listView 这样被破坏的东西,所以最好保留对 asyncTask 的引用。
于 2012-12-20T01:45:35.267 回答