java - 如何在AsyncTask doInBackground()中使用同步对象?

标签 java android multithreading android-asynctask thread-safety

我在后台线程中使用同步对象时遇到了麻烦。我已经在示例中详细说明了问题:

  1. 我编写了这样的简单类:

    public class UIThreadClass {
    
       MyObject object;
    
       UIThreadClass() {
          object = new MyObject();
    
          object.doActionOne();
          object.doActionTwo();
      }
    }
    
  2. 现在我的任务是通过将两个方法放入非 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/

相关文章:

java - 来自 Firebase 的数据未显示在 RecyclerView 中

Java 链表数组

android - SoundPool.load() 是否设计为异步加载?

c - FreeRTOS 跨线程读取

android - Android:在手机上处理视频和声音

c++ - 在线程之间传输函数调用

java - 将集合传递到 JPA 存储库错误

java - 将 java 对象存储为 clob 并检索

android - 如何用 ByteBuddy 替换 Android Activity

android - 广播接收器中的Android音频管理器