繁体   English   中英

如何在Android中正确处理AsyncTask取消?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM