我在后台线程中使用同步对象时遇到了麻烦。我已经在示例中详细说明了问题:
我编写了这样的简单类:
public class UIThreadClass { MyObject object; UIThreadClass() { object = new MyObject(); object.doActionOne(); object.doActionTwo(); } }
现在我的任务是通过将两个方法放入非 UI 线程来改进代码。 我正在使用 AsyncTask
对于 doActionOne()
private static class DoActionOneTask 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.doActionOne(); } return null; } }
对于 doActionTwo()
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; } }
现在在 UI 线程中调用它们
public class UIThreadClass { MyObject object; UIThreadClass() { object = new MyObject(); new DoActionOneTask(object).execute(); new DoActionTwoTask(object).execute(); } }
问题是:
When using AsyncTask - how to synchronized the object to make sure that the doActionTwo() alway call after doActionOne() method ?.
我尝试在 doInBackground() 中使用 synchronized (myObject) {myObject.doActionOne();} 但系统警告我 myObject 只是局部变量,很难保证正确性。
任何人都可以帮助我解决这种情况吗?非常感谢!
最佳答案
您无需执行任何操作。它们将按照 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.
关于java - 如何在AsyncTask doInBackground()中使用同步对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49913051/