2017-06-16 153 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

这是一个好主意,但我不能忽视这些数据,我试图放一段时间循环但应用程序崩溃.... –