如果我想从AsyncTask访问它们,是否需要复制静态对象?

时间:2010-11-02 16:01:00

标签: java android android-asynctask

我有一个项目使用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;否则它可能会失败

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

2 个答案:

答案 0 :(得分:0)

可能是因为多个线程正在尝试更改同一个对象。它可能会导致意外结果/完全失败。您可能想要使用一些锁,以便没有2个线程可以同时更新对象。在这种情况下,它会减慢你的异步操作,因为它们都依赖于完全一个intance。我猜你正在使用静态对象是有原因的,如果可能的话,你可能会考虑采用其他方式。

答案 1 :(得分:0)

根据您的编写,我认为您不需要复制,除非MyObjectType不是线程安全的,在这种情况下,您需要确保一次只有1个线程修改它/它是非线程安全的方法。 (制作副本确实可以解决这个问题,但是如果你可以制作副本,那么你真正应该使用的是全局静态吗?)

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