iは

2016-09-03 4 views
-1

として、私はクラス本体を持っていると仮定し.execute文の後AsyncTaskクラスの結果を使用することができます(これは、クラスのちょうどラフなデザインです。)iは

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

私の質問は、ウィルトーストショー「の成功でありますまたは "null"と表示されます。 バックグラウンドで別のスレッドを開始しようとしているので、obj.executeはブロッキングステートメントであるかどうかを示します。 コントロールは.executeステートメントの次のステートメントに移動するか、バックグラウンドスレッドが完了するまで待機しますか?

+0

号インポッシブルを使用することができます。トーストは、asynctaskが実行される前に呼び出され、終了する前に証明されます。そのトーストは、AsyncTaskのonPostExecute()に置く必要があります。 – greenapps

+0

AsyncTaskはブロックされません。結果はおそらくnullになる可能性があります –

+1

AsyncTaskが別のクラスであるため、[OnPostExecute()の結果をメインアクティビティに取得する方法]の可能な複製?](http://stackoverflow.com/questions/12575068/how-to- asynctask-is-a) –

答えて

0

Asyctaskタスクが独自のスレッドで実行されるため、コントロールはトーストに移行します。しかし、obj.resultは、結果がトーストの実行前に設定されるという保証がないので、nullの結果を返します。

+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

あなたは正しいです、私はそれを変更しました –