首页 文章

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

提问于
浏览
0

我在我的应用程序中实现了AsyncTask,以便从Internet正确下载文件并将数据放入我的本地数据库 . 文件正在下载,一切正常 . 我还检查是否有互联网连接,如果没有,我在我的doInBackground方法中返回0,是什么导致我的AsyncTask调用“onPostExecute”方法,一切都按预期进行 . 但我看到,如果互联网连接不佳,例如我处于WiFi范围的边缘,AsyncTask有时会下载文件几分钟 . 这不是我想要的 . 所以我在onPreExecute方法Handler中实现了我的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方法不会被调用?

1 回答

  • 2

    为此,您可以使用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();
    
        }
    
    }
    

相关问题