如何停止正在运行的异步任务?

时间:2014-12-06 04:48:31

标签: java android http android-asynctask httpurlconnection

我在android中运行异步任务来ping某个特定的URL,但问题是当url无效或无法访问时发生异常,因为sockettimeoutexception就这个异常我要停止正在运行的任务。 iagve尝试使用取消()方法,但这会导致应用程序崩溃。

我正在使用以下代码。

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");



}

2 个答案:

答案 0 :(得分:0)

你做这样的事情:

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

其中downloadNetTask是您异步任务的实例。在异步任务中,实现以下方法,以便在取消任务时执行所需操作。

protected void onCancelled(List<CompanyNseQuoteDataVO> result)

protected void onCancelled()

答案 1 :(得分:0)

问题是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;
 }