Android 向AsyncTask doInBackground()传递最后一个参数

Android 向AsyncTask doInBackground()传递最后一个参数,android,android-asynctask,Android,Android Asynctask,我知道我们应该将参数传递给执行中的AsyncTasks。。。方法 但是,我想知道,在以下代码中,线程安全会发生什么情况: private void foo (final CustomObj myObj) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { myObj.doSom

我知道我们应该将参数传递给执行中的AsyncTasks。。。方法

但是,我想知道,在以下代码中,线程安全会发生什么情况:

private void foo (final CustomObj myObj) {

    new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {

            myObj.doSomething();

            return null;
        }

    }.execute();

}
另外,AsyncTask如何处理传递的参数以确保其线程安全?

参考文档:

doInBackgroundParams…,在后台线程上调用

因此,同样的情况也会发生在线程安全方面,然后创建新的线程,放置myObj.doSomething;在它的运行中,启动它。没有上下文,很难说您的调用是否是线程安全的。如果除了AsyncTask之外没有任何东西可以访问myObj,并且myObj本身也不能访问任何公共数据,那么我很确定它将是线程安全的

关于你的第二个问题:

AsyncTask被设计成一个围绕线程和处理程序的助手类 并且不构成通用线程框架

以及:

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中传递的对象的线程安全