代码之家  ›  专栏  ›  技术社区  ›  Truong Giang Dam

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

  •  2
  • Truong Giang Dam  · 技术社区  · 7 年前

    我在后台线程中使用同步对象时遇到了问题。我已经在示例nutshell中指定了问题:

    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();
        }
      }
      

    问题是:

    使用AsyncTask时-如何同步对象以确保 doActionTwo()总是在doActionOne()方法之后调用?。

    我试过使用 同步(myObject){myObject.doActionOne();} 在doInBackground()中,但系统警告我,myObject只是局部变量,很难保证正确性。

    有人能帮我解决这个问题吗?非常感谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Raj Suvariya    7 年前

    你不需要做任何事。它们将按照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.