2015-01-05 2 views
2

Рассмотрим следующий пример: активностьКогда выполняется onPostExecuted из AsyncTask?

public class ExampleActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_info); 

     new ExampleTask().execute(""); 

     // code line 1 
     // code line 2 
     // code line 3 
     // code line 4 
    } 

    public class ExampleTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... address) { 

      // some long-running stuff 
      return ""; 
     } 

     protected void onPostExecute(String text) { 

     } 
    } 
} 

С

new ExampleTask().execute(""); 

мы начать AsyncTask отходящей от потока пользовательского интерфейса. Мы не можем предсказать, когда он будет закончен. Метод AsyncTaskonPostExecute снова запускается в потоке пользовательского интерфейса.

Скажем, AsyncTask выполнен в то время как code line 2 метода onCreate выполняется. Когда будет выполняться метод onPostExecute? Подождите, пока не будет выполнено onCreate или будет выполнено немедленно?

Я думаю, что этот вопрос можно обобщить на то, как Java (или, по крайней мере, Android) обрабатывает потоки, которые выходят из основного потока, но возвращаются к основному потоку и как Java/Android планирует две последовательности кода, которые «конкурируют» за немедленное изъятие. Таким образом, было бы неплохо, если бы ответ дал бы небольшую общую информацию.

ответ

2

вы можете увидеть все это для себя здесь: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/AsyncTask.java

  // that's on the background thread 
line #288: return postResult(doInBackground(mParams)); 

private Result postResult(Result result) { 
     @SuppressWarnings("unchecked") 
     Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT, 
       new AsyncTaskResult<Result>(this, result)); 
     // here it sends the message to the intenral UI handler 
     message.sendToTarget(); 
     return result; 
    } 

, что означает:

AsyncTask отправить сообщение своим внутренним обработчиком UI, это означает, что onPostExecute будет только выполняться после того, как все остальное, поставленное в очередь на UI, выполняется Looper.

0

onPostExecute будет вызываться сразу после завершения задачи в методе doInBackground. см. информацию о AsyncTask

Скажем, AsyncTask выполняется, когда выполняется строка кода 2 метода onCreate. Когда будет выполняться метод onPostExecute? Подождите, пока не будет выполнено onCreate или будет выполнено немедленно?

Да, он ждет завершения завершения записи, onPostExecute вызывается после метода onCreate.

+0

Это описывает, когда onPostExecute вызывается с уважением к жизненному циклу AsyncTask, но совсем не по отношению к потоку пользовательского интерфейса. – FWeigl

+0

См. Обновление. – BeingMIAkashs

+1

Ожидает завершения операцииПодтверждение –

1

Он будет вызываться после завершения onCreate(), потому что любые обратные вызовы в потоке пользовательского интерфейса обрабатываются последовательно. Итак, сначала идет onCreate(), затем onPostExecute() Однако, похоже, это деталь реализации, и вы не должны полагаться на это.

Смежные вопросы