我正在尝试将此代码添加到我的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下收到一个错误,提示“ Downloader无法解决”,在publishProgress下也收到一个错误,提示“类型AsyncTask中的方法publishProgress(String ...)不适用于该参数”。 (int)“我认为任务分配可以帮助将isCancelled放入我的AsyncTask中。我也进行了研究,发现在代码中使用isCancelled的方式不止一种。我已经意识到,对于isCancelled刚接触它的人来说确实很麻烦。

最佳答案

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

关于android - 如何处理AsyncTask中的isCancelled,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18882456/

10-12 06:19