My ArrayList data is not destroyed when creating new instance of a class
我运行三个AsyncTask(),每个AsyncTask创建另一个类的对象。
这就是我如何从doInBackground()创建类的实例,
1
| DOM domObject = new DOM; |
现在,我的DOM类中有一个类级ArrayList,
1 2
| 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类的新实例时,数据不会被删除。
为什么会这样?
例子,第一个AsyncTask创建的DOM类的第一个实例,在arraylist中添加了一些数据。
DOM类的第二个实例是由第二个AsyncTask实例创建的,在ArrayList中添加了一些新数据,但以前实例中的数据仍然存在。
为什么呢?
- tempNewsArray是static,这意味着DOM的所有实例都使用相同的tempNewsArray。
- 但是如果我这样做,public static ArrayList> tempNewsArray然后在另一个方法(如new ArrayList<>();)中创建它的实例,那么以前DOM实例中的数据就不存在了。为什么这一行为自ArrayList以来仍然是static呢。
Instances share a single copy of that member,which is initiated once,when the Domclass is initiated.
如果你希望每个Dom成员都有自己的阵列,则修改其声明如下:
1
| public ArrayList <HashMap <String, Object >> tempNewsArray = new ArrayList <>(); |
- 但是如果我这样做,public static ArrayList> tempNewsArray然后在另一个方法(如new ArrayList<>();中创建它的实例,那么以前DOM实例中的数据就不存在了。为什么这一行为自ArrayList以来仍是static。
- @joe如果通过给它分配一个新的arraylist istance来覆盖tempNewsArray引用,则旧的arraylist对象不再被该静态变量引用,但它不会改变所有实例只共享一个tempNewsArray成员的事实。在静态初始化表达式(或静态初始值设定项块)中初始化静态成员时,它将仅初始化一次。