2016-10-01 5 views
1
@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    asyntask.execute(); 
} 

私はいくつかのAPIからデータを読んでいます。 doInBackground()onPostExecuteから電話することはできますか?doInBackgroundをonPostExecuteから呼び出すことはできますか?

(ネットワークタスクとUIの更新)のように再帰的に5回したいですか?前もって感謝します。

+0

なぜあなたはそれをしたいのですか?AsyncTaskにインターフェイスのリファレンスを渡す必要がありますか? –

+0

doInBackgroundがネットワークタスクを実行するために実行され、doInBackgroundが完了した後にdoInBackgroundの後にonPostExecuteが実行されてUIが変更されます。 –

+0

これは再帰的に(ネットワークタスクとUIの更新) onPostexecuteからのdoInbackground @ArjunIssar、@ masked man –

答えて

2

AsyncTaskを再びonPostExecuteから開始することは恐ろしい考えです。あなたはUIの更新と共にネットワークコールのために5回のように再帰的にやりたいので、AsyncTaskコールを追跡するためのインターフェイスを保つことを提案したいと思います。

ここでは、その動作をどのように達成できるかについての例を示します。このようにinterfaceを作成することができます。

public interface MyResponseListener { 
    void myResponseReceiver(String result); 
} 

これで、AsyncTaskクラスにインターフェイスが宣言されました。したがって、AsyncTaskは次のようになります。

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

    // Declare an interface 
    public MyResponseListener myResponse; 

    // Now in your onPostExecute 
    @Override 
    protected void onPostExecute(final String result) { 
     // Send something back to the calling Activity like this to let it know the AsyncTask has finished. 
     myResponse.myResponseReceiver(result); 
    } 
} 

今、あなたはinterfaceあなたはこのようなあなたのActivityですでに作成したを実装する必要があります。 Activity

public class MainActivity extends Activity implements MyResponseListener { 
    // Your onCreate and other function goes here 

    // Declare an AsyncTask variable first 
    private YourAsyncTask mYourAsyncTask; 

    // Here's a function to start the AsyncTask 
    private startAsyncTask(){ 
     mYourAsyncTask.myResponse = this; 
     // Now start the AsyncTask 
     mYourAsyncTask.execute(); 
    } 

    // You need to implement the function of your interface 
    @Override 
    public void myResponseReceiver(String result) { 
     if(!result.equals("5")) { 
      // You need to keep track here how many times the AsyncTask has been executed. 
      startAsyncTask(); 
     } 
    } 
} 
+0

素敵な説明ありがとうございます@Reaz Murshed –

0

doInBackground()は、onPostExecuteを呼び出す前に呼び出されます。

UIスレッドでネットワークタスクを実行できないため、AsyncTaskが作成されます。 AsyncTaskはバックグラウンドで実行され、ワー​​カースレッドでネットワークタスクを実行します。その後、バックグラウンドタスクが完了すると、onPostExecute()が呼び出され、UIスレッドでUIが変更されます。

これは役立つはず:https://developer.android.com/reference/android/os/AsyncTask.html

https://developer.android.com/training/basics/network-ops/index.html

0

AsyncTaskクラスは、バックグラウンドでいくつかの作業を行うとMainThreadに結果それは、一般ことはできませんを公開するために使用されるために行われているの仕事ワーカースレッドは、MainThreadでネットワーキングするときのNetworkOnMainThreadExceptionのようにMainThreadで実行できません。 私は、あなたの仕事の配列を作ることをお勧めしますAsyncTaskのサブクラスの​​メソッドを呼び出すと、ワーカースレッドで行われるジョブをシリアル化します。

関連する問題