java - android:应用程序关闭后,单例实例不会被垃圾回收

标签 java android singleton fragment

我有一个带有 fragment 的 Android Activity 。

在该 fragment 中,我使用改造来获取数据并设置静态标志,这样,当我再次访问该 fragment 时,我会再次限制获取数据。

我还将数据存储在单例实例中。

但即使在我销毁 Activity/关闭应用程序之后,静态标志和实例仍然可用,并且列表也存在于实例中,这使我的应用程序发生故障。

但我希望重新创建实例并在每次运行时获取数据。

这是我的单例实例。

public class Utilities {

    private static Utilities utils = null;

    private List<Data> friendsList;

    public List<Data> getDataList() {
        return dataList;
    }

    public void setDataList(List<Data> dataList) {
        this.dataList = dataList;
    }

    private List<Data> dataList;

    public synchronized static Utilities getInstance(){

        if(utils == null){
            utils = new Utilities();
        }
        return utils;
    }
}

这是我的 fragment :

public class DataFragment extends Fragment
{
    private static boolean hasObtainedData;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)  {

        if(!hasObtainedData){
            getData(v);
        }else{
           recyclerView.setAdapter(new Adapter(utils.getDataList()));
         }
     }

     private void getData(View v) {

         //get Data using Retrofit:
         hasObtainedData = true;
         utils.setDataList(dataListObtainedUsingRetrofit)
         recyclerView.setAdapter(new Adapter(utils.getDataList()));
    } 
}

这就是我从 MainActivity 调用我的 fragment 的方式:

@Override
public void onTabSelected(TabLayout.Tab tab) {
           getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragmentBox, new DataFragment()).commit();
    }    

我尝试在 MainActivity 的 onDestroy() 处提供 System.gc(),但单例实例仍然处于 Activity 状态。

我根据这个搜索了很多SOF帖子,但无法解决这个问题。

任何帮助都会非常有用。

最佳答案

指向 Singleton 的指针在 Utilities-Class 本身中是静态的,因此 Singelton 永远不能用于 GC,除非您在离开 MainAcitivity 时设置 utils = null

Utilities.reset();

关于java - android:应用程序关闭后,单例实例不会被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311868/

相关文章:

java - 在 fragment B 中执行操作后如何更新 fragment A

java - 为什么.class文件的常量池表中没有列出一维数组类型?

java - Android - 如何通知用户数据库中的一行已更新

java - findViewById() 可能会为 HomeFragment.java 中的 getView() 产生 NullPointerException

android - 如何加载特定的SDK?

android - genymotion 蓝屏死机 windows 10

python - 确保只运行一个类的一个实例

java - 如何创建 Exp(-x^2) 函数?

java - 将对象保存到实体中而不将其保存在 JPA 中

c# - 在 C# 中为 'this' 创建一个实例变量