我有一个使用的项目 AsyncTask 在后台完成工作。
该项目还使用类作为静态值(例如数据库键)的通用持有人,但也用于整个项目的一个或两个有用的对象。假设这堂课叫 public class Constants.

我想从一个 AsyncTask, ,我不知道我是否需要复制它。
我实际上并没有遇到错误或崩溃,但是我会收到一些无法复制的用户反馈报告崩溃,所以我在说我对此做错了什么。

我目前的处理是:

onStart() {// somewhere in the UI thread  
new MyTask(Constants.theObject).execute(); // (1)  
}  
// ...  
class MyTask extends AsyncTask<...> {  
MyObjectType object;  
MyTask(MyObjectType theObjectInstance) {  
object = theObjectInstance; // (2)  
// ...  
doInBackground() { // (3)  
//  ...  
} 

(1), Constants.theObject 是在应用程序启动时创建的静态对象

(2), ,我得到对现有静态对象的引用 Constants.theObject

(3), ,我们不再在UI线程中,我想访问 Constants.theObject (也可能在主线程中使用)

.

我认为有三种可能的情况。

  • 这个代码很丑陋,我应该做否则
  • 此代码还可以,用户反馈与此无关
  • 这个代码还可以,但是我应该副本 Constants.theObject 如果我想在 doInBackground;否则可能会失败

我希望你能帮帮我!非常感谢您的阅读。

有帮助吗?

解决方案

从您写的内容来看,我认为您不需要制作副本,除非 MyObjectType 不是线程安全的,在这种情况下,您需要确保一次只修改1个线程/它的未螺纹安全保护。 (制作副本确实可以解决这个问题,但是如果您可以制作副本,那么无论如何您应该使用什么?)

您是否100%确定只有在对象初始化后才能发生1和3?

其他提示

可能是因为多个线程正在尝试更改同一对象。它可能导致意外的结果/完全失败。您可能想使用一些锁定,以便没有两个线程可以同时更新对象。这种情况将减慢您的ASYNCH操作,因为它们都取决于确切的意图。我猜您是出于某种原因使用静态对象的,您可能需要考虑一下它在可能的情况下采取其他方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top