在片段中使用静态数组适配器,是好还是不好的做法?

4

我在Java中进行了大量关于静态对象的谷歌搜索,并且我认为我理解了它们在Android中的工作方式。静态对象在应用程序进程终止时被GC收集,而不是在声明静态对象的Activity销毁时(如果我错了,请纠正我)。我有一个使用Fragments的Tabhost应用程序。声明对象的Fragment位于ViewPager的最右侧(共三个Fragments)。右侧选项卡具有显示用户数据的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 中编写了此代码(它是父 Tab Fragments 的一个)。我将此代码放在 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;
}

在我的Fragment中使用以下代码:
if (personList == null)
{

    personList = new ArrayList<String>();

}


if (arrayAdapter == null)
{

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

}
1个回答

12

请记住!任何使用您的活动Context的引用并标记为STATIC的内容都容易出现内存泄漏问题。这是极不建议的。您可以使用某种观察者/可观察模式将数据保留在其他类中或通过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);
}

我想我可能已经弄清楚了。这段代码看起来对你来说是否好? - John P.
1
就像我说的那样,将适配器/视图设置为静态不是一个好主意。看看我的更新答案。我给你举了一个例子,将getActivity()转换为您的Activity类,并调用在该类中定义的所需方法。这样做将使您的适配器摆脱静态。 - waqaslam
@Waqas 但是,当我们明确将其引用(很可能在onDestroy()中)设置为null时,使用static引用是否可以? - Muhammad Babar
@Waqas 前台运行的活动是否可能由于内存不足而被杀死? - Muhammad Babar
是的,背景这个东西甚至会造成伤害!感谢您的帮助,我非常感激。 - Muhammad Babar
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接