如何阻止清除ArrayList

时间:2018-04-20 08:06:09

标签: java android memory arraylist memory-management

我有一个Android应用,其中包含某些文件的列表。

这些文件在像这样的ArrayList中

public static ArrayList<File> list=new ArrayList<File>();
list.add("PATH");
list.add("PATH");
list.add("PATH");
....

上面的ArrayList存在于Application Class中。

主要问题是假设用户暂时将我的应用最小化,直到我的应用加载文件列表并且用户开始使用其他应用。在我的应用程序加载结束后,list包含所有必要文件的列表。用户在一段时间后返回,但同时当用户使用其他应用程序时,Android系统需要释放一些内存,以便清除我的应用程序中的ArrayList,因为我的应用程序位于最近的列表中并且当前未被用户。

因此,当用户返回时,他必须再次等待,直到装载结束。

是否有任何解决方案,因为我不想永远保存ArrayList,但希望它不被Android系统清除。

3 个答案:

答案 0 :(得分:4)

您也可以使用Singleton类来提供此用例。

class Holder
{
    private static Holder instance = null;
    private List<String> itemArray;
    private Holder(){
       itemArray = new ArrayList<>();
    }

    public static Holder getInstance(){
        if (instance == null)
            instance = new Holder();
        return instance;
    }

    public List<String> getItemArray(){
        return new ArrayList<>(this.itemArray);
    }

    public void addItemToArray(String item){
            this.itemArray.add(item);
    }
}

答案 1 :(得分:1)

您可以考虑使用SharedPreferences

编辑。

SharedPreferences preferences = getSharedPreferences("PATH_KEEPER",MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();     

//You can use Set<String> or turn into Json and store as String
Set<String> stringSet = new HashSet<>();

stringSet.add("somePath");
stringSet.add("somePath");
editor.putStringSet("Path",stringSet);
editor.apply();

//Whenever you want to remove
editor.clear();

答案 2 :(得分:1)

如果您将列表保留在活动类中,并将文件路径存储为String,那么此代码将满足您的目的:

对于String Array:

public static ArrayList<String> list = new ArrayList<String>();

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putStringArrayList("list", list);
}

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    list = savedInstanceState.getStringArrayList("list");
}