我有一个看起来像这样的方法:
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();
}
(我已经大大简化了示例。)
在 AsyncTask
的 doInBackground()
方法中直接使用提供给 doSomething()
的参数是否明智?或者这会导致线程相关的问题吗?
此外,如果第三个参数是 Context
会有什么不同吗?实例而不是String
?
最佳答案
AsyncTask
做出了一些保证,您可以在它的 documentation 中看到这些保证。 ,但这些主要与访问 AsyncTask
的字段有关。
在您的示例中,您使用基元和字符串。两者都无法真正修改,因此您在这方面是安全的。
但是,如果您使用的对象可以从另一个线程修改,那么您无法真正确定在调用 execute()
和当您实际使用该对象时,当您在 doInBackground()
中读取它时,它不会被更改,或者更糟糕的是,当您尝试在 doInBackground() 中修改它时,它会被修改)
并可能以损坏状态结束。对于这些情况,您需要使用同步来确保一次只有一个线程可以读取或修改此类对象。
如果您需要在 doInBackground()
中使用对象时保持对象的值/状态与调用 execute()
时相同,您可能需要这样做克隆它并使用这个克隆作为快照。
关于java - 在 AsyncTask 的 doInBackground() 方法中使用这些变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581143/