Java 如何在AsyncTask doInBackground()中使用同步对象?
我在后台线程中使用同步对象时遇到问题。我已经在示例中详细说明了问题:Java 如何在AsyncTask doInBackground()中使用同步对象?,java,android,multithreading,android-asynctask,thread-safety,Java,Android,Multithreading,Android Asynctask,Thread Safety,我在后台线程中使用同步对象时遇到问题。我已经在示例中详细说明了问题: 我编写的简单类如下所示: public class UIThreadClass { MyObject object; UIThreadClass() { object = new MyObject(); object.doActionOne(); object.doActionTwo(); } } 现在,我的任务是通过将两种方法放到非UI线程来改进代码。 我正在使用
public class UIThreadClass {
MyObject object;
UIThreadClass() {
object = new MyObject();
object.doActionOne();
object.doActionTwo();
}
}
有人能帮我解决这个问题吗?非常感谢 你不需要做任何事情。它们将按照Android文档顺序执行
Order of execution
When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.
If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.
AsyncTask顾名思义,它将异步执行任务,您可以创建一个单独的线程并执行操作并同步它们,而不是使用将同时运行的ThreadPoolExecutor。要了解更多信息,您可以从第一个Asynctask的onPostExecute方法开始第二个Asynctask,或者使用ThreadPoolExecutor。顺便说一句,使用WeakReference的方式不安全,您应该将
wObject.get()
存储在变量中,然后执行if语句。再次调用wObject.get()
可能会在某个时候给出一个空引用。@AkshayKatariya:但我想要的是“如何同步”。问题解决了,谢谢你,谢谢你,伙计,你是对的,这是我的错误,没有清楚地阅读文档。
private static class DoActionTwoTask extends AsyncTask<Void, Void, Void> {
private WeakReference<MyObject> wObject;
DoActionOneTask(MyObject object) {
wObject = new WeakReference<>(object);
}
@Override
protected Void doInBackground(Void... voids) {
if(wObject.get() != null) {
MyObject myObject = wObject.get();
myObject.doActionTwo();
}
return null;
}
}
public class UIThreadClass {
MyObject object;
UIThreadClass() {
object = new MyObject();
new DoActionOneTask(object).execute();
new DoActionTwoTask(object).execute();
}
}
Order of execution
When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.
If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.