4

私はJavaの静的オブジェクトで大量のGoogle検索を行ってきましたが、Androidでそれらがどのように機能するかを理解していると思います。静的オブジェクトは、静的オブジェクトを宣言するアクティビティが破棄されたときではなく、アプリのプロセスが終了したときにGCされます(間違っている場合は修正してください)。フラグメントを使用するタブホストを備えたアプリがあります。オブジェクトを宣言するフラグメントは、ViewPagerの右端(3つのフラグメントがあります)にあります。右側のタブには、ユーザーデータを表示するListViewがあり、ユーザーがすべてのタブをスワイプしたり、アプリから移動したりしても、そのデータを保持したいと思います。このデータは保存する必要はありません。アプリの通常の使用を通じてメモリに保持する必要があります。必要な結果が得られる修正は、アレイアダプタに静的プレフィックスを設定することです。私の質問は、これは良い習慣と考えられていますか?静的オブジェクトを誤って使用するとメモリの問題が発生する可能性があることはわかっていますが、FCを広範囲に使用することはできませんでした(横向きから縦向き、タブをすばやくスワイプする、ListViewに大量のデータを追加するなど)。これが私が使用しているコードです

static ArrayAdapter<String> arrayAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
{

    View view = inflater.inflate(R.layout.fragment,
            container, false);      

        if (personList == null)
        {

            personList = new ArrayList<String>();

        }


        if (arrayAdapter == null)
        {

            arrayAdapter = new ArrayAdapter<String>
            (getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, personList);

        }

編集:

これが私がこのアイデアを実装する方法です。このコードはメインのアクティビティ(タブフラグメントの親となるアクティビティ)にあります。このコードをアクティビティのonDestroy()メソッドに入れて、メモリを再利用しようとしています。

@Override
protected void onDestroy() {
    super.onDestroy();

    if (arrayAdapter != null)
    {

        arrayAdapter.clear();

        arrayAdapter = null;

        Log.i("Activity", "Adapter nulled!");

    }


    Log.i("Activity", "Activityhas been destroyed");
}

public ArrayAdapter<String> getArrayAdapter(ArrayList<String> personList)
{

    arrayAdapter = new ArrayAdapter<String>
    (getBaseContext(), android.R.layout.simple_list_item_1, personList);

    Log.i("Activity", "Adapter Created");


    return arrayAdapter;
}

私のフラグメントにこのコードがあります

if (personList == null)
{

    personList = new ArrayList<String>();

}


if (arrayAdapter == null)
{

    arrayAdapter = ((ActivityMainScreen)getActivity()).getArrayAdapter(personList);

}
4

1 に答える 1

12

覚えて!アクティビティへの参照を消費し、 STATICContextとしてマークされているものはすべて、メモリリークが発生しやすくなります。強くお勧めしません。ある種のObserver/Observableパターンを使用して、データを他のクラスで使用できるようにしたり、TabHostアクティビティで定義されたパブリックメソッドを介して必要なオブジェクトに簡単にアクセスしたりできます。

詳細については、こちらのhttp://developer.android.com/training/basics/fragments/communicating.htmlをご覧ください。

メモリリークに関しては、新しいモデルのデバイスはリソースの点でかなり豊富であるため、おそらくローエンドデバイスで現在の実装をテストする必要があります。


あなたの活動:

private ArrayAdapter<String> arrayAdapter = null;

//initialize your adapter in onCreate

public ArrayAdapter<String> getListAdapter(){
    return arrayAdapter;
}

あなたの断片:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    ArrayAdapter<String> adapter = ((YourActivityClass) getActivity()).getListAdapter();
    yourListView.setAdapter(adapter);
}
于 2012-11-27T23:55:07.197 に答える