0

我正在AsyncTask做后台工作并填充ListViewonProgressUpdate并调用notifyDataSetChanged()适配器。问题是当方向改变时,AsyncTask停止。无论如何,我怎样才能AsyncTask继续做它的工作并填充结果?ListView我不能使用android:configChanges="keyboardHidden|orientation",因为我的布局在横向模式下是不同的。我也尝试使用Service类,但我无法访问我的 UI 组件。实现我所追求的最简单的方法是什么?

4

1 回答 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 回答