2

Fragmentローテーション中のデータ読み込みに時間がかかるのを避けたい。

public class WatchlistFragment extends SherlockListFragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (savedInstanceState == null) {
            data = getTimeConsumingData();          
        } else {
            Log.i(TAG, "savedInstanceState is not null!");
            // Avoid performing time consuming data operation during rotation changes.
            // But I never have chance to reach here !?!?
            data = savedInstanceState.getStringArray("data");
        }
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data));
    }

    public String[] getTimeConsumingData() {
        Log.i(TAG, "WatchlistFragment getTimeConsumingData");
        return new String[] { "A", "B", "C"};
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.i(TAG, "WatchlistFragment onSaveInstanceState");
        super.onSaveInstanceState(outState);
        outState.putStringArray("data", data);
    }

    private String[] data = null;
    private static final String TAG = WatchlistFragment.class.getSimpleName();
}

不思議なことに、何度かローテーションを行ってもsavedInstanceStateinonActivityCreatedは常に null です。

注意してください、setRetainInstance(true)説明されているように使用しないことを好みますAndroid Fragments Retaining Data 作成者は を使用してonSaveInstanceStateいます。なぜ私のものがうまくいかないのかわからないというだけです。

4

3 に答える 3

1

もう 1 つのアプローチは、新しい非常に巧妙な Loader パターンを使用することです。これは実装が簡単で、システムにすべてを処理させます。

http://developer.android.com/guide/components/loaders.html

于 2013-02-25T11:09:49.370 に答える
0

setRetainInstance(true)フラグメントで使用し、チェックしsavedInstanceState==nullてオーバーライドしないでくださいonSaveInstanceState

アップデート

 private ArrayAdapter<String> adapter = null;
 public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setReatainInstance(true);
    if(adapter==null){
        adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,getTimeConsumingData());
    }
    setListAdapter(adapter);
}
于 2013-02-25T10:56:27.183 に答える
0

ローダーを使用している場合は、データをロードした後に loadermanager.destory(loader_id) を使用します。構成の変更のために再度ロードされることはありません。

于 2013-02-25T12:43:14.190 に答える