【问题标题】:Static Array Adapter in Fragment. Good or bad practice?片段中的静态数组适配器。好的做法还是坏的做法?
【发布时间】:2012-11-27 23:36:31
【问题描述】:

我在 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);

}

【问题讨论】:

    标签: android memory static fragment android-arrayadapter


    【解决方案1】:

    记住!任何使用您的活动 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);
    }
    

    【讨论】:

    • 感谢您的回答!我正在考虑将阵列适配器放在我的选项卡主机活动中,因为那样它就会有我想要的寿命。我只是不知道如何从 Fragment 类中获取该对象。
    • 我想我可能已经想通了。你觉得代码好看吗?
    • 就像我说的,将适配器/视图设置为静态不是一个好主意。看看我更新的答案。我正在给您一个示例,将 getActivity() 转换为您的 Activity 类并调用该类中定义的所需方法。这样做将使您的适配器摆脱静态
    • 非常感谢您提供的所有帮助,您在这里真的帮助了我。我希望你有一个美好的一天!
    • @Waqas 但是当我们明确地 nulling 它的 reference (很可能在 onDestroy() 中)时,可以使用 static 引用吗?
    猜你喜欢
    • 2021-07-06
    • 2011-12-25
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2020-05-19
    • 2013-01-24
    相关资源
    最近更新 更多