我知道我们应该在execute(...)方法中将params传递给AsyncTasks。
但是,我想知道,在以下代码中线程安全方面会发生什么:
private void foo (final CustomObj myObj) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
myObj.doSomething();
return null;
}
}.execute();
}
另外,AsyncTask对传递的params做了什么来确保它们的线程安全?
答案 0 :(得分:0)
参考AsyncTask文档:
doInBackground(Params ...),在后台线程上调用
因此,在线程安全方面完全相同的情况下,您创建新的Thread
,将myObj.doSomething();
放入其run()
并启动它。没有上下文,很难说你的电话是否是线程安全的。如果除了myObj
和AsyncTask
以外的任何访问myObj
本身都无法访问任何公共数据,那么我非常确定它是线程安全的。
关于你的第二个问题:
AsyncTask旨在成为Thread和Handler的辅助类 并不构成通用的线程框架。
和
AsyncTask保证所有回调调用都是同步的 以下操作在没有明确的情况下是安全的方式 同步。
Set member fields in the constructor or onPreExecute(), and refer to them in doInBackground(Params...). Set member fields in doInBackground(Params...), and refer to them in onProgressUpdate(Progress...) and onPostExecute(Result).
这意味着问题并不完全正确。 AsyncTask
与传递的参数线程安全无关,因为它是为不同目的而设计的,只是用于获取线程执行结果的辅助类(基于文档将以正确的方式同步)。
因此,开发人员有责任确保doInBackground()
内传递的对象的线程安全。