【问题标题】:Android - Thread safety while updating arraylistAndroid - 更新数组列表时的线程安全
【发布时间】:2014-11-08 23:43:22
【问题描述】:

我的 Activity 由一个 BroadcastReceiver 和一个 AsyncTask 组成,它们都更新一个 ArrayList(非常频繁)。我了解 AsyncTask 在后台运行,BroadcastReceiver 和 AsyncTask 线程可能会同时更新 ArrayList。如何使它们成为线程安全的?

编辑:正如亚历山大所说,广播接收器在主线程上运行,除非您以其他方式明确实现它。

【问题讨论】:

  • 尝试创建队列结构
  • 除非您向我们展示访问和更新列表的代码(在两个线程中),否则不可能给出可靠的答案。 (有多种方法可能起作用...)
  • 尽量让它在任何时候都只能访问一次。存储/排队任何其他传入的更改。当然,这仅取决于立即更改的重要性。一种非常幼稚的方法是制作一个静态变量并在每次更改时更改它,这也是可以更改 ArrayList 的条件。也许有更好的方法,但这应该有效。这个问题也存在于例如一个 StringBuilder 和一个 BufferedStringBuilder(BufferedStringBuilder 是 Threadsecure)。也许你可以在那里找到一些有用的东西......我希望这会有所帮助。约翰

标签: java android concurrency


【解决方案1】:

AsyncTask 作为一个单独的线程运行。 BroadcastReceiver 通常在主线程上运行,除非您在“registerReceiver”中另有说明(参见此处:http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver,%20android.content.IntentFilter,%20java.lang.String,%20android.os.Handler) )

您可以使用 Budius 所写的 Vector,也可以使用 synchronized 块包装对 ArrayList 的所有访问:

synchronized(myList){
    myList.add(itemToAdd);
}

【讨论】:

  • 谢谢,我不知道广播接收器在主线程上运行。不错的收获!另外,感谢 Budius,我决定使用 Vector。
猜你喜欢
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
相关资源
最近更新 更多