私は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);
このようにして、アクティビティが再作成された場合でも、oncreateView()に次のようなものを追加して、AsyncTaskへの参照を取得できます。
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 に答える