在Android中取消异步任务

拉沙德

我试图在一段时间后取消异步任务。我搜索并发现了很多与此有关的问题,所有问题都具有相同的答案,例如我在下面所做的事情。

问题:调用cancel之后,Web服务似乎没有取消,因为它从未到达onPostExecute。请任何帮助将不胜感激。

我试过的

一段时间后,我打电话给

使用asyncTask作为其参数并执行以下操作的TimeOut类:

if (task.getStatus() == AsyncTask.Status.RUNNING )
        {task.cancel(true);}
   if(task.isCancelled()==true)
            {
                Log.e(TAG,"TASK IS CANCELLED");
            }

在我的异步课程中

@Override
    protected void onCancelled() {

        webServiceError=true;  //when timeout change it to true.(default false)
        Toast.makeText(context, R.string.webserviceDownloadUserDataError, Toast.LENGTH_LONG).show();
        if (pd.isShowing()) {
            pd.dismiss();
        }
        super.onCancelled();
    }

    @Override
    protected String doInBackground(String... params) {
        int paramsTracker = 0;
        webServiceError = false;


        while(webServiceError==false) {

            HttpClient httpclient = new DefaultHttpClient();

            String url = params[paramsTracker];
            paramsTracker = paramsTracker + 1;

            HttpPost httppost = new HttpPost(url);

            int paramsCount = params.length;

            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(paramsCount);
                for (int i = 0; i < (paramsCount - 1) / 2; i++) {
                    Log.d(TAG, "parameters: " + params[paramsTracker] + " - " + params[paramsTracker + 1]);
                    nameValuePairs.add(new BasicNameValuePair(params[paramsTracker], params[paramsTracker + 1]));
                    paramsTracker = paramsTracker + 2;
                }
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                // execute http post request, call web service


                response = httpclient.execute(httppost);


            }

            catch (Exception e) {
                webServiceError = true;
                Log.e(TAG, e.toString());
                try {
                    AppLogging(TAG, "Error in calling web service " + e.toString(), LogFileName.ErrorLogFilename);
                } catch (Exception a) {
                }
            }


            if (webServiceError == false) {

                int CNT = 0;
                try {

                    String query = "SELECT COUNT(*) AS CNT FROM TASKS";
                    Cursor cursor = MainActivity.myDataBase.rawQuery(query, null);
                    if (cursor.moveToFirst()) {
                        do {
                            CNT = Integer.parseInt(cursor.getString(cursor.getColumnIndex("CNT")));
                        } while (cursor.moveToNext());
                        cursor.close();
                    }
                } catch (Exception e) {
                    Log.e(TAG, e.toString());
                    try {
                        AppLogging(TAG, "Error in Database error getting task count " + e.toString(), LogFileName.ErrorLogFilename);
                    } catch (Exception a) {
                    }
                }

                if (CNT == 0) {
                    String webServiceResponse = "";
                    try {
                        Log.d(TAG, "Getting web service response");
                        // get web service response
                        HttpEntity entity = response.getEntity();
                        String content;
                        content = EntityUtils.toString(entity);
//                  Log.d(TAG, "content: "+ content);
                        // parse XML response
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();
                        InputSource is = new InputSource();
                        is.setCharacterStream(new StringReader(content));
                        Document doc = db.parse(is);
                        NodeList nodes = doc.getElementsByTagName("string");
                        Element line = (Element) nodes.item(0);
                        webServiceResponse = getCharacterDataFromElement(line);



                        String patternForON = "SET IDENTITY_INSERT \\[.*?\\] O?((N)|(FF))\\s*?;";
                        Pattern rForON = Pattern.compile(patternForON);
                        Matcher mForON = rForON.matcher(webServiceResponse);
                        String webServiceResponseWithOutIdentityInsert = mForON.replaceAll("");

                        String patternForInsert = "\\bINSERT (?!INTO)";
                        Pattern rForInsert = Pattern.compile(patternForInsert);
                        Matcher mForInsert = rForInsert.matcher(webServiceResponseWithOutIdentityInsert);
                        String webServiceResponseWITHOUTINSERTALONE = mForInsert.replaceAll("INSERT INTO ");
                        String webServiceResponsePURIFIED = webServiceResponseWITHOUTINSERTALONE.replaceAll(";;", ";");
                        Log.d(TAG, "content: " + webServiceResponsePURIFIED);
                        ///////////END OF for removing queries that are not applicable in SQLITE

                        //FOR SPLITTING THE QUERIES AND PLACING EACH AT AN INDEX IN contentArray ARRAY
                        //String contentArray [] = webServiceResponse.split(";");
                        String contentArray[] = webServiceResponsePURIFIED.split(";");
                        Log.d(TAG, "contentArray length" + contentArray.length + ""); //GETS THE NUMBER OF QUERIES
                        pd.setMax(contentArray.length); //SETTING THE PROGRESS DIALOG (MAX PROGRESS)

                        for (int i = 0; i < contentArray.length; i++) {
                            // add the downloaded data to the local database
                            String query = contentArray[i];
                            try {
                                AppLogging(TAG, "Queries Downloaded splitted and purified\n query " + i + " :" + contentArray[i], LogFileName.LogFilename);
                            } catch (Exception l) {
                            }
                            Log.d(TAG, "query: " + query);
                            // if query contains "getdate()" replace with DATETIME('now'), to render the query executable in sqlite
                            query = query.replace("GETDATE()", "DATETIME('now')");

                            try {
                                MainActivity.myDataBase.execSQL(query); //EXECUTE QUERY
                            } catch (Exception e) {
                                Log.e(TAG, e.toString());
                                try {
                                    AppLogging(TAG, "Error in performing query: " + query + "\nError: " + e, LogFileName.ErrorLogFilename);
                                } catch (Exception a) {
                                }
                            }

                            //Log.d("Initialize database, HTTPRequestGetUserData ", query);

                            publishProgress();
                        }
                    } catch (Exception e) {
                        webServiceError = true;
                        Log.e(TAG, e.toString());
                        try {
                            AppLogging(TAG, "Error:  " + e.toString(), LogFileName.ErrorLogFilename);
                        } catch (Exception a) {
                        }
                    }
                }
            }
           if (isCancelled()) return "0";
        }
        return "1";
    }
用户名

根据Android AsyncTask文档,调用cancel()AsyncTask后将不会调用,onPostExecute()而是会调用onCancelled()因此需要流程。

现在按照此处的文档,您的代码

@Override
    protected String doInBackground(String... params) {

       while(webServiceError=false) {
                 .....//calling webservice
             if (isCancelled()) return "0";
        }
      return "1";
}

现在,您的onCancelled()看起来像,带有String参数

@Override
protected void onCancelled(String object) { // Here object should be 0

    webServiceError=true;  //when timeout change it to true.(default false)
    Toast.makeText(context, R.string.webserviceDownloadUserDataError, Toast.LENGTH_LONG).show();
    if (pd.isShowing()) {
        pd.dismiss();
    }
    super.onCancelled();
}

现在在此方法中争论object will be 0别担心,这两种方法onPostExecute(),并onCancelled()会在主UI线程上运行。

现在我建议你的是,创建要执行从一个私有方法onPostExecute(),并onCancelled()用字符串参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android中安排多个异步任务

来自分类Dev

通过按钮取消异步任务

来自分类Dev

Android-Loopj异步任务取消

来自分类Dev

在Android中定期运行异步任务

来自分类Dev

在ReactiveUI ViewModel(ReactiveObject)中取消异步任务

来自分类Dev

在Swift中触摸屏幕时取消的异步任务

来自分类Dev

Android中的RxJava异步任务

来自分类Dev

服务中的Android异步任务冻结UI

来自分类Dev

单击按钮后无法取消异步任务

来自分类Dev

取消所有异步任务

来自分类Dev

异步任务取消C#Xamarin

来自分类Dev

春天取消@异步任务

来自分类Dev

异步取消任务

来自分类Dev

如何从客户端取消异步任务

来自分类Dev

取消令牌中的任务?

来自分类Dev

通过按钮取消异步任务

来自分类Dev

Android-Loopj异步任务取消

来自分类Dev

在Android中安排多个异步任务

来自分类Dev

在ReactiveUI ViewModel(ReactiveObject)中取消异步任务

来自分类Dev

在Android中管理多个异步任务

来自分类Dev

如何取消活动中按回的异步任务

来自分类Dev

了解Android中的并行异步任务

来自分类Dev

C#异步任务取消

来自分类Dev

使用异步任务取消任务

来自分类Dev

取消 WebClient 下载任务异步

来自分类Dev

不使用 AsyncTask 的 Android 中的异步任务

来自分类Dev

取消 componentWillUnmount 中的任务

来自分类Dev

取消异步任务?

来自分类Dev

Xamarin Android 从通知中取消任务