如何删除Android中线程中使用的最终变量

时间:2016-03-18 13:14:30

标签: java android multithreading

我正在使用 Retrofit2 DBFlow 。将数据保存到数据库时出现问题。当我同时调用线程两次时,某些数据会重复。问题是我的List,因为这个变量是最终的。我必须设置final,因为我需要在我的帖子中使用这个List。

然后,有一种方法可以将最终删除到我的列表并替换为某些东西?

改造onResponse()

public void onResponse(Call<AdminPictures> call, Response<AdminPictures> response) {
        AdminPictures apResponse = response.body();

        // Here is my list
        final List<PictureInfos> pictureInfos = apResponse.getPicturesList();

        new Thread(new Runnable() {
            @Override
                public void run() {
                    try {
                        // The List is used here
                        for (PictureInfos infos : pictureInfos) {
                           if(!infos.exists()){
                              infos.save();
                           }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();

5 个答案:

答案 0 :(得分:2)

将列表的声明移到类的顶部并创建一个类变量......

List<PictureInfos> pictureInfos....

答案 1 :(得分:1)

  1. 将其设为类变量。
  2. 否则,而不是匿名类;将您的代码移动到一个单独的类中。然后使用构造函数
  3. 传递变量

答案 2 :(得分:0)

请试试这个

synchronized(this) {
        for (PictureInfos infos : pictureInfos) {
            if(!infos.exists()){
                infos.save();
            }
        }}

我尝试的是首先插入线程数据,同时阻止另​​一个。

答案 3 :(得分:0)

也许你有两次请求并且响应两次,所以线程被剔除两次。

答案 4 :(得分:-1)

也许这很愚蠢,但您是否尝试在for循环结束时清除变量?

...
for (PictureInfos infos : pictureInfos) {
    if(!infos.exists()) {
        infos.save();
    }
}
pictureInfos.clear();
...