2016-09-03 2 views
-1

Предположим, у меня есть тело класса, как: (Это просто грубый дизайн класса ..)Могу ли я использовать результат класса AsyncTask после .Execute заявления

class XYZ 
    { 


     //Some Code here 
     submitBTN.setOnClickListener(..){ 
        ABC obj=new ABC(); 
        obj.execute(); 
        Toast(obj.result).show(); 
       } 

     class ABC extends AsynTask<String,Void,String>{ 
     String result=null; 
     .. 
     .. 
     doInBackground(..){ 
       .. 
       .. 
      return "success"; 

      } 
      onPostExecute(String result){ 
       this.result=result; 
       } 
    } 
    } 

Мой вопрос заключается Toast Show «Успех "или он отобразит" null "; Поскольку мы запускаем другой поток в фоновом режиме , поэтому obj.execute является оператором блокировки или нет Я имею в виду, будет ли управление перемещаться к следующей инструкции после инструкции .execute или будет ли она ждать до тех пор, пока фоновый поток не завершится?

+0

No. невыполнима. Тост вызывается перед запуском и завершением работы асинтезы до его завершения. Вы должны поместить этот тост в onPostExecute() для AsyncTask. – greenapps

+0

AsyncTask не блокирует. Результат будет, скорее всего, пустым –

+1

Возможный дубликат [Как получить результат OnPostExecute() для основного действия, потому что AsyncTask - это отдельный класс?] (Http://stackoverflow.com/questions/12575068/how-to- get-the-result-of-onpostexecute-to-main-activity-as-asynctask-is-a) –

ответ

0

Элемент управления будет перемещаться в тост, поскольку задача Asyctask выполняется в своем потоке. Но obj.result даст нулевой результат, потому что вы не гарантируете, что результат будет установлен до выполнения тоста.

+0

, что означает, что obj.execute - это неблокирующий оператор. Если у меня есть отдельный класс AsynTask, и я хочу показать успех в Toast то я могу это сделать. Если да, то скажите, как это сделать. – Johny

+0

Да, он не блокирует –

0

Вы можете использовать интерфейсы

public interface OnStuffDone{ 
void onResult(String result); 
} 

public AsyncTask<String,Void,String> abc (OnStuffDone onStuffDone){ 
    return new AsyncTask<String,Void,String> 
     ... 
    doInBackground(..){ 

     ... 
     return "success"; 

     } 
     onPostExecute(String result){ 
      onStuffDone.onResult(result); 
      } 

     } 

     abc(new OnStuffDone 
     ... 
     @Override 
    public void onResult(String result){ 
    //Show result 
    } 
    ).execute() 
+0

, вы правы, я изменил его –

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