片段中的静态数组适配器。好坏练习?

时间:2012-11-27 23:36:31

标签: android memory static fragment android-arrayadapter

我已经在Java中对静态对象进行了大量的搜索,我想我了解它们在Android中是如何工作的。当应用程序的进程终止时,静态对象是GC,而不是当声明静态对象的Activity被销毁时(如果我错了,请纠正我)。我有一个使用Tabhost的应用程序,其中包含Fragments。声明对象的Fragment一直到ViewPager的右边(有三个片段)。右侧的选项卡有一个显示用户数据的ListView,我希望当用户浏览所有选项卡或导航离开应用程序时,该数据会持续存在。这些数据不需要保存,只需通过正常使用应用程序就可以保留在内存中。给我想要的结果的修复方法是为我的Array Adapter设置一个静态前缀。我的问题是,这被认为是好的做法吗?我知道不正确地使用静态对象会导致内存问题,但是我没有得到任何广泛使用的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);

        }

编辑:

这就是我实现这个想法的方式。我在我的主Activity中有这个代码(父对象标签碎片。我把这个代码放在活动的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);

}

1 个答案:

答案 0 :(得分:12)

记住!任何消耗对您的活动Context的引用并标记为 STATIC 的内容都容易出现内存泄漏。强烈建议不要这样做。您可以使用某种 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);
}