2017-06-16 35 views
0

onPostExecuteメソッドを持つAsyncTask(.execute())があります。このメソッドは、最初のonPostExecuteの実行を続行する前に別のAsyncTask(.execute())を開始する必要があります。最初のスレッドを一時停止し、2番目のスレッドが終了するのを待つことは可能ですか?最初にpostExecuteを完成させるには、2番目のpostExecuteメソッドの結果が必要です。AsyncTask優先度を設定する

以下の例:

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

    @Override 
    protected String doInBackground(String... strings) { 
     HttpURLConnection conn = null; 
     try { 
      URL url = new URL(strings[0]); 
      conn = (HttpURLConnection)url.openConnection(); 
      conn.setRequestMethod("GET"); 

      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      String linieNoua = ""; 
      String crlf = System.getProperty("line.separator"); 
      StringBuilder sb = new StringBuilder(); 
      while((linieNoua = br.readLine()) != null) { 
       sb.append(linieNoua); 
       sb.append(crlf); 
      } 
      conn.disconnect(); 
      return sb.toString(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

RetrieveData retrieveData = new RetrieveData() { 
     @Override 
     protected void onPostExecute(String s) { 
      if (s != null) { 
       retrieveTransport(transportRegNr); 
      } else { 
       Toast.makeText(getApplicationContext(), R.string.login_server_error, Toast.LENGTH_LONG).show(); 
      } 
     } 
    }; 
    retrieveData.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"http://192.168.0.101:3000/route/" + prefs.getString("email",null)); 
} 

private void retrieveTransport(String regNr){ 

    RetrieveData retrieveData = new RetrieveData() { 
     @Override 
     protected void onPostExecute(String s) { 
      if (s != null) { 
       try { 
        JSONObject jsonObject = new JSONObject(s); 

        String model = jsonObject.getString("model"); 
        String regNr = jsonObject.getString("regNr"); 
        int type = jsonObject.getInt("type"); 
        int seats = jsonObject.getInt("seats"); 

        t = new Transport(model,regNr,null,seats,type); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } else { 
       Toast.makeText(getApplicationContext(), R.string.login_server_error, Toast.LENGTH_LONG).show(); 
      } 
     } 
    }; 
    retrieveData.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"http://192.168.0.101:3000/transport/registryNr/" + regNr); 
} 

私はretrieveTransport(String regNr)からexecute方法、onPostExecuteを使用している場合は、呼び出されることはありません。 executeOnExecutorを使用すると、それらは同時に実行されていますが、それもうまくいきません。私は最初に完了する必要がありますretrieveTransport;それがなければ、私は最初のonPostExecuteを続けることができません。

答えて

0

使用AsyncTaskは、保留中の実行中、またはfinshがあなたの新しいtask.likeを起動するときfinished.andされているかどうかを

のgetStatus()

チェック:

if(retrieveTransport.getStatus() == AsyncTask.Status.PENDING){ 
    // My AsyncTask has not started yet 
} 

if(retrieveTransport.getStatus() == AsyncTask.Status.RUNNING){ 
    // My AsyncTask is currently doing work in doInBackground() 
} 

if(retrieveTransport.getStatus() == AsyncTask.Status.FINISHED){ 
    // START NEW TASK HERE 
} 

あなたのアプリの例:

 if (retrieveTransport!= null && retrieveTransport.getStatus() == AsyncTask.Status.FINISHED) { 
      //START retrieveData TASK HERE 
     } 
     else 
     { 
      //IGNORE 
     } 
+0

それはいい考えですが、私はそのデータを無視することはできません、私はwhileループを入れようとしましたが、アプリケーションはクラッシュします.... –

関連する問題