java - 在 AsyncTask 的 doInBackground() 方法中使用这些变量是否安全?

标签 java android android-asynctask thread-safety

我有一个看起来像这样的方法:

public void doSomething(final int num1, final int num2, final String str) {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            reallyComplexStatisticFunction(num1 + num2, str);
        }
    }.execute();
}

(我已经大大简化了示例。)

AsyncTaskdoInBackground() 方法中直接使用提供给 doSomething() 的参数是否明智?或者这会导致线程相关的问题吗?

此外,如果第三个参数是 Context 会有什么不同吗?实例而不是String

最佳答案

AsyncTask 做出了一些保证,您可以在它的 documentation 中看到这些保证。 ,但这些主要与访问 AsyncTask 的字段有关。

在您的示例中,您使用基元和字符串。两者都无法真正修改,因此您在这方面是安全的。

但是,如果您使用的对象可以从另一个线程修改,那么您无法真正确定在调用 execute() 和当您实际使用该对象时,当您在 doInBackground() 中读取它时,它不会被更改,或者更糟糕的是,当您尝试在 doInBackground() 中修改它时,它会被修改) 并可能以损坏状态结束。对于这些情况,您需要使用同步来确保一次只有一个线程可以读取或修改此类对象。

如果您需要在 doInBackground() 中使用对象时保持对象的值/状态与调用 execute() 时相同,您可能需要这样做克隆它并使用这个克隆作为快照。

关于java - 在 AsyncTask 的 doInBackground() 方法中使用这些变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581143/

相关文章:

java - PROGUARD:使用 keepInnerClass 标志是否会丢失有关其是否静态的信息

Java Jackson 解析动态 JSON 对象

java - 扩展 AsyncTask 而不覆盖其参数

Android:AsyncTask,我的第一个任务在另一个开始时还没有完成

java - Grails:只允许特定用户喜欢 Java Spark

java - Dom4J 在写入文件时保留空格

android - Android布局设计帮助

Android 使用 ListView 查看分页器并动态添加文本

java - 如何在android中检查时间只在晚上的两个时间之间

超过线程池 9 和排队任务 128 时,android 应用程序崩溃