[英]How properly handle AsyncTask cancelling in Android?
我在我的應用程序中實現了AsyncTask,以正確地從Internet下載文件並將數據放入本地DB。 文件正在下載,一切正常。 我還檢查是否有Internet連接,如果沒有,我在doInBackground方法中返回0,是什么導致我的AsyncTask調用“ onPostExecute”方法,並且一切正常。 但是我看到,如果互聯網連接狀況不佳,例如我處於WiFi范圍的邊緣,AsyncTask有時會下載文件幾分鍾。 這不是我想要的。 因此,我在onPreExecute方法處理程序中實現了我的AsyncTask。
isFreezed = new Handler();
isFreezed.postDelayed(new Runnable() {
@Override
public void run() {
if (!isCancelled() && getStatus() != AsyncTask.Status.FINISHED){
cancel(true);
//Log.i("callingActivity", "Zbyt wolne połączenie, anulowanie.");
onPostExecute((long) 0);
}
}
},8000);
我要取消我的AsyncTask。 我看到當我取消它時,不會執行onPostExecute方法,因此我手動調用它。 這就是我的問題,谷歌表示不應手動調用它。 我的思維方式是否很好,並且讓處理程序取消任務並繼續使用我的應用程序是一種好習慣,還是我應該采用其他方式呢? 我是對的,當我取消AsyncTask時,不會調用它的onPostExecute方法嗎?
為此,您可以使用Async任務,例如
private class AsyncTaskDemo extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(true);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
// do stuff according to your need
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
@Override
protected void onCancelled() {
super.onCancelled();
progressDialog.dismiss();
Toast toast = Toast.makeText(MainActivity.this,
"Error connecting to Server", Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, 25, 400);
toast.show();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.