5

Fragment を含むフラグメントアクティビティがあり、 Fragment はデータをダウンロードする Asynctask を開始します。 Fragment にコールバックメソッドを実装し、アダプターとリストビューの値を更新します。私が抱えている問題は次のとおりです。これは私の onCreateView メソッドです(重要な部分):

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    list=(PullToRefreshListView)v1.findViewById(R.id.listapull);
    adapterList=new ListViewAdapter(secciones, mContext);
}

AsyncTask の実行中にデバイスを回転すると、doInBackground() メソッドが実行され続け、実行後、リスナーがトリガーされ、フラグメントでコールバック メソッドが開始されます。このメソッドには、アダプターとリスト ビューの古い参照があります。 ここに画像の説明を入力

向きの変更が発生するとフラグメントとそのコンテンツが再作成され、それは正しいですが、向きの変更前に作成されたアダプターとリストビューへの参照をコールバックメソッドが保持している理由を知っている人はいますか?

編集:

次のように asynctask を実行するボタンがあります。

asyncRefresh = new PullRefreshTask(taskContext, mContext, secciones);
asyncRefresh.setUpdatePull2RefreshListener(this);
asyncRefresh.execute();

ユーザーがボタンを押すと、asyncTask は古い Fragment をリスナーとして設定し、asynctask の実行中に方向の変更が発生すると、アクティブ化されたコールバック メソッドは新しく作成されたフラグメント メソッドのものであると考えましたが、もうわかりません。

編集2:

最初の編集でコールバックメソッドが古いフラグメントに対して呼び出されていたと言ったように、私は問題を解決しました。だから私がしたことは、「Info」という名前の別のクラスの変数に asynctask を保存し、作成ビューでこれを行ったことです:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        list=(PullToRefreshListView)v1.findViewById(R.id.listapull);
        adapterList=new ListViewAdapter(secciones, mContext);
        PullRefreshTasktask task = Info.getAsyncTask();
        asyncRefresh =  task;
        asyncRefresh.setUpdatePull2RefreshListener(this);
    }

このようにして、フラグメントの新しい参照を

setUpdatePull2RefreshListener()

実行中の asynctask のメソッド

4

1 に答える 1

1

...コールバックメソッドが、向きが変わる前に作成されたアダプターとリストビューへの参照を保持している理由を知っている人はいますか?

(この回答は、コールバックの実装やAsyncTask見た目を知らなくても得られます) なぜコールバックは古いフラグメントへの参照を保持すべきではないのですか? Buttonそのリスナーに現在の インスタンスを設定しFragment、タスクの実行中にデバイスの回転を行います。Fragment構成の変更後に再構築されるAsyncTaskため、新しいフラグメントを指すようにコールバックインスタンスを更新するコードはありません。使用方法に応じて、 が破棄されるのを防ぐメソッドをFragment使用できるため、ローテーション後でもタスクは同じコールバック インスタンスを持つことができます。また、この特定の問題に関する Android エンジニアの回答もご覧ください。Fragment.setRetainInstance()Fragment

于 2012-11-22T19:57:01.067 に答える