2017-06-16 484 views
0

我有一個AsyncTask(.execute())onPostExecute方法。該方法在繼續執行第一個onPostExecute之前開始另一個需要完成的AsyncTask(.execute())。是否可以暫停第一個線程並等待第二個線程完成?我需要第二個postExecute方法的結果才能完成第一個postExecuteAsyncTask設置優先級

一個下面的例子:

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

如果我使用execute方法,從retrieveTransport(String regNr)onPostExecute永遠不會被調用。如果我使用executeOnExecutor,它們同時運行,那也不好。我需要完成第一個retrieveTransport;沒有,我不能繼續第一個onPostExecute

回答

0

使用

的getStatus()

檢查是否該爲的AsyncTask掛起,運行,或finished.and當完成日常啓動新task.like:

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

這是一個好主意,但我不能忽視這些數據,我試圖放一段時間循環但應用程序崩潰.... –