我有一个项目使用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
;否则它可能会失败我希望你能帮助我!非常感谢阅读。
答案 0 :(得分:0)
可能是因为多个线程正在尝试更改同一个对象。它可能会导致意外结果/完全失败。您可能想要使用一些锁,以便没有2个线程可以同时更新对象。在这种情况下,它会减慢你的异步操作,因为它们都依赖于完全一个intance。我猜你正在使用静态对象是有原因的,如果可能的话,你可能会考虑采用其他方式。
答案 1 :(得分:0)
根据您的编写,我认为您不需要复制,除非MyObjectType
不是线程安全的,在这种情况下,您需要确保一次只有1个线程修改它/它是非线程安全的方法。 (制作副本确实可以解决这个问题,但是如果你可以制作副本,那么你真正应该使用的是全局静态吗?)
您是否100%确定1和3只能在对象初始化后才会发生?