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