Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在AsyncTask doInBackground()中使用同步对象?_Java_Android_Multithreading_Android Asynctask_Thread Safety - Fatal编程技术网

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();
      }
    }
    
  • 现在,我的任务是通过将两种方法放到非UI线程来改进代码。 我正在使用异步任务

    用于doActionOne()

  • 问题是:

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

    我曾尝试在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.
    

    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.