2013-10-02 6 views
0

Предположив Я использую следующие AsycTask (так называемый ) для передачи данных через Интернет:AsyncTask вложенные вызовы

private class A extends AsyncTask<Void, Void, Void>{ 
    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     pd = ProgressDialog.show(context, "Notification", "Sending message..."); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     sendMessage(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     if(pd!=null && pd.isShowing()) 
      pd.dismiss();   
    } 
} 

Внутри doInbackground называется мой метод SendMessage(). Я не буду вдаваться в подробности этого метода, просто убедитесь, что этот метод выполняет Thread (предположим, что он называется B).

Итак, вопрос:

Код внутри onPostExecute() из AsyncTask будут выполняться после окончания ThreadB?

Если нет, то как можно сделать возможным выполнение onPostExecute только тогда, когда AsyncTask внутри sendMessage() будет прекращен?

ответ

1

вы могли бы позволить sendMessage() вернуть объект Thread, а затем вызвать

Thread.join() 

Это заставит doInBackground ждать, пока поток не будет закончен.

+0

Вы правы, я просто разбирался в методе join(), и он работает для меня. – GVillani82

1

Ну, это довольно просто. Просто позвоните AsyncTaskB в onPostExecute от AsyncTaskA.

Редактировать: Резьба внутри резьбы невозможна с ICS и далее. Это не даст вам никаких ошибок, но это тоже не сработает, и ваше приложение застрянет там.

+0

Очевидный @Ravi, но мой теоретический вопрос – GVillani82

+0

mate, не могли бы вы разместить ссылку или что-то вроде. Я хочу узнать подробности об этом. Заранее спасибо. – guness

+0

@bluebrain У меня нет ссылки на него, но если вы посмотрите на рабочий стиль 'AsyncTask', вы получите ответ, который довольно прост. –

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