如果要从异步键访问静态对象,我是否需要复制静态对象?
-
28-09-2019 - |
题
我有一个使用的项目 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操作,因为它们都取决于确切的意图。我猜您是出于某种原因使用静态对象的,您可能需要考虑一下它在可能的情况下采取其他方式。
不隶属于 StackOverflow