如何在AsyncTask中处理isCancelled

时间:2013-09-18 21:13:34

标签: android android-asynctask

我正在尝试将此代码添加到我的doInBackGround中,以便我可以捕获当用户按下后退按钮时设置的标志

protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

这是我的doInBackGround以及我用来设置asynctask被取消标志的代码

@Override
public void onBackPressed() 
{              
    /** If user Pressed BackButton While Running Asynctask
        this will close the ASynctask.
     */
    if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
    {
        mTask.cancel(true);
    }          
    super.onBackPressed();
    finish();
}


@Override
protected void onDestroy() {
    // TODO Auto-generated method stub


/** If Activity is Destroyed While Running Asynctask
        this will close the ASynctask.   */

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

    super.onDestroy();

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub


 if (pDialog != null)
 {
     if(pDialog.isShowing())
     {
         pDialog.dismiss();
     }
        super.onPause();

  }  

}

class LoadAllData extends AsyncTask<String, String, String> {



    protected String doInBackground(String... args) {  

        try {
            Intent in = getIntent();
            String searchTerm = in.getStringExtra("TAG_SEARCH");
            String query = URLEncoder.encode(searchTerm, "utf-8");
            String URL = "example.com";
            JSONParsser jParser = new JSONParsser();
            JSONObject json = jParser.readJSONFeed(URL);
            try {

                JSONArray questions = json.getJSONObject("all").getJSONArray("questions");

                for(int i = 0; i < questions.length(); i++) {
                    JSONObject question = questions.getJSONObject(i);


                String Subject = question.getString(TAG_QUESTION_SUBJECT);
                String ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER);
                String Content = question.getString(TAG_QUESTION_CONTENT);

当我尝试将isCancelled翻译成我的asynctask时出现问题。我在Downloader下收到错误,指出&#34; Downloader无法解决&#34;我也在publishProgress下得到一个说#34; AsyncTask类型中的方法publishProgress(String ...)不适用于参数(int)&#34;我可以帮助将isCancelled放入我的AsyncTask中。我也完成了我的研究,发现在代码中使用isCancelled的方法不止一种。我已经意识到处理isCancelled对于刚接触它的人来说真的很麻烦。

2 个答案:

答案 0 :(得分:1)

1)要解决错误,请将Downloader设为类的公共静态数据变量。
2)请确认

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>

是类声明

After you called cancel() isCancelled() will return true, and after your doInBackground returned onCancelled is executed instead of onPostExecute. The Parameter will issue an interrupt on the background thread, so your long-time operations are closed. However, I'd assume you catch that somewhere?

希望这有助于.. :) .. 如果它没有解决错误..请发布logcat详细信息

来自SDK:

  

取消任务

     

可以通过调用cancel(boolean)随时取消任务。   调用此方法将导致后续调用isCancelled()   返回true。在调用此方法之后,改为onCancelled(Object)   之后将调用onPostExecute(Object)   doInBackground(Object [])返回。确保取消任务   你应该尽快检查返回值   如果可能的话,定期从doInBackground(Object [])获取isCancelled()   (例如在循环内部。)

另外请在功能块的开头使用super.onpause()等

请参阅: - link

答案 1 :(得分:0)

在这种情况下,您需要为Asynctask类编写一个单独的文件。也做一个接口回调。

你不需要覆盖onBackPress按钮,你只需要将progressDialog设置为cancelable(True)并设置onCancelListner()。在这里你可以设置一个标志isCanceld = true;

整个场景在此链接中定义。

android asynctask sending callbacks to ui

看到Dmitry Zaitsev的答案尝试这个,让我知道是否卡在任何地方

希望这会有所帮助