gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:52:49 24 4
gpt4 key购买 nike

我有一个项目,使用 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(它也可能在主线程中使用)

.

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

  • 这段代码很难看,我应该这样做
  • 这段代码没问题,用户反馈与此无关
  • 这段代码相当不错,但如果我想在 doInBackground 中使用它,我应该复制 Constants.theObject ;否则可能会失败

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

最佳答案

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

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

关于java - 如果我想从 AsyncTask 访问静态对象,是否需要复制它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4079556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com