【问题标题】:how to stop a running async task? [duplicate]如何停止正在运行的异步任务? [复制]
【发布时间】:2014-12-06 04:48:31
【问题描述】:

我在 android 中运行异步任务以 ping 特定 URL,但问题是当 url 无效或无法访问时,异常发生为 sockettimeoutexception,因此我想停止正在运行的任务。 iagve 尝试使用 Cancel() 方法,但这会导致 App 崩溃。

我正在使用以下代码。

private class UrlDataProvider3 extends AsyncTask<String, Void, String>
{

    String ret="";
    int checkStatus;
    Boolean exception=false;
    @Override
    protected String doInBackground(String... url) 
    {

        HttpURLConnection con = null;

        try 
          { 

            Log.i("RAE", "urlData"+url[0]);
            HttpURLConnection.setFollowRedirects(true);
             con = (HttpURLConnection) new URL(url[0]).openConnection();
                 con.setRequestMethod("POST");
              con.setConnectTimeout(20000);




          }


        catch (IOException e)
          {


            if(e.toString().contains("java.net.SocketTimeoutException:"))
            {



                return null;

            }



          }



    return ret;
    }
    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        Log.i("RAE"," Asyc finished");



}

【问题讨论】:

    标签: java android http android-asynctask httpurlconnection


    【解决方案1】:

    你做这样的事情:

    if((this.downloadNetTask != null) 
          && (this.downloadNetTask.getStatus() != AsyncTask.Status.FINISHED)){
            this.downloadNetTask.cancel(true);
    }
    

    downloadNetTask 是异步任务的实例。在您的异步任务中实现以下方法以在任务取消时执行您想要的操作。

    protected void onCancelled(List<CompanyNseQuoteDataVO> result)
    
    protected void onCancelled()
    

    【讨论】:

    • 应用程序崩溃并显示 taskCancellation 异常
    • 在此处粘贴堆栈跟踪。
    • 12-06 10:42:06.192:E/AndroidRuntime(31001):致命异常:主要 12-06 10:42:06.192:E/AndroidRuntime(31001):java.util.concurrent。 CancellationException
    • 这是正常的。当运行时取消挂起的任务时,它会引发 CancellationException。检查以确保您的异步任务完成。
    • 请问我该怎么做。
    【解决方案2】:

    问题是 AsyncTask.cancel() 调用仅调用任务中的 onCancel 函数。这是您要处理取消请求的地方。

    这是我用来触发更新方法的一个小任务

    private class SomeTask extends AsyncTask<Void, Void, Void> {
    
            private boolean running = true;
    
            @Override
            protected void onCancelled() {
                running = false;
            }
    
            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
                onUpdate();
            }
    
            @Override
            protected Void doInBackground(Void... params) {
                 while(running) {
                     publishProgress();
                 }
                 return null;
            }
         }
    

    或者你可以像下面这样检查你的任务。

    protected Object doInBackground(Object... x) {
        while (/* condition */) {
          // work...
          if (isCancelled()) 
              break;
          }
        return null;
     }
    

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多