【问题标题】:My ArrayList data is not destroyed when creating new instance of a class [duplicate]创建类的新实例时,我的 ArrayList 数据不会被破坏[重复]
【发布时间】:2015-03-17 21:46:26
【问题描述】:

我正在运行三个AsyncTask() 每个AsyncTask 创建另一个类的对象。

这就是我从doInBackground() 创建一个类的实例的方式,

        DOM domObject = new DOM;

现在,我的DOM 班级中有一个班级级别ArrayList,

public class DOM {
    public static ArrayList<HashMap<String, Object>> tempNewsArray = new ArrayList<>();

我的主类运行三个AysncTask 对象,因此应该为每个AsyncTask 创建三个单独的DOM 类实例。

在每次执行AsyncTask 时,都会将一些数据添加到ArrayList。

例如, 首先执行AsynTask, 在ArrayList 中添加了一些数据。 第二个AsyncTask被执行, ArrayList中添加的一些数据(以前的数据不应该在ArrayList中)

但问题是,DOM 类的前一个实例的数据仍然存在于 ArrayList 中,并且在另一个 AysnTask 实例创建 DOM 类的新实例时不会被删除。

为什么会这样?

例如, DOM 类的第一个实例由第一个 Asynctask 创建, ArrayList 中添加了一些数据。

DOM 类的第二个实例由第二个Asynctask 实例创建, 在ArrayList 中添加了一些新数据,但之前实例中的先前数据仍然存在。

为什么会这样?

【问题讨论】:

  • tempNewsArray 是static,这意味着DOM 的所有实例都使用相同的tempNewsArray
  • 但如果我这样做,public static ArrayList&lt;HashMap&lt;String, Object&gt;&gt; tempNewsArray 然后在另一个类似的方法中创建它的实例,new ArrayList&lt;&gt;(); 然后来自先前DOM 实例的数据不存在。为什么自 ArrayList 以来的这种行为仍然是 static。

标签: java android dom arraylist android-asynctask


【解决方案1】:

tempNewsArray 是静态的,因此所有 Dom 实例共享该成员的一个副本,该成员仅在初始化 Dom 类时初始化一次。

如果您希望每个 Dom 实例都有自己的 ArrayList 成员,请将其声明更改为:

public ArrayList<HashMap<String, Object>> tempNewsArray = new ArrayList<>();

【讨论】:

  • 但是如果我这样做,public static ArrayList&lt;HashMap&lt;String, Object&gt;&gt; tempNewsArray 然后在另一个类似的方法中创建它的实例,new ArrayList&lt;&gt;(); 然后来自先前DOM 实例的数据不存在。为什么自 ArrayList 以来的这种行为仍然是 static。
  • @Joe 如果您通过为其分配一个新的 ArrayList 实例来覆盖 tempNewsArray 引用,则该静态变量不再引用旧的 ArrayList 对象,但它不会改变存在的事实是所有实例共享的唯一一个tempNewsArray 成员。当您在静态初始化表达式(或静态初始化程序块)中初始化静态成员时,它只会被初始化一次。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多