4

我在 Java 中对静态对象进行了大量的 Google 搜索,我想我了解它们在 Android 中的工作原理。当应用程序的进程终止时,静态对象会被 GC,而不是在声明静态对象的 Activity 被销毁时(如果我错了,请纠正我)。我有一个带有 Tabhost 的应用程序,其中使用了 Fragments。声明对象的Fragment一直在ViewPager的右边(共有三个Fragment)。右侧的选项卡有一个显示用户数据的 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);

        }

编辑:

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

}
4

1 回答 1

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);
}
于 2012-11-27T23:55:07.197 回答