1

我正在尝试将此代码添加到我的代码中,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和我用来设置要取消异步任务标志的代码

@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成我的异步任务时,问题就来了。我收到一个错误Downloader,上面写着“Downloader无法解决”我还收到一个错误,上面写着“AsyncTask 类型中publishProgress的方法publishProgress(String ...)不适用于参数(int)”我只是在分配任务是有人可以帮助将其isCancelled放入我的 AsyncTask。isCancelled我也进行了研究,发现在您的代码中使用的方法不止一种。我已经意识到处理isCancelled对于刚接触它的人来说真的很麻烦。

4

2 回答 2

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。调用此方法后,将在 doInBackground(Object[]) 返回后调用 onCancelled(Object),而不是 onPostExecute(Object)。为了确保尽快取消任务,如果可能(例如在循环内),您应该始终从 doInBackground(Object[]) 定期检查 isCancelled() 的返回值。

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

参考这个:-链接

于 2013-09-18T21:20:30.507 回答
0

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

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

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

android asynctask向ui发送回调

查看尝试这个的答案,Dmitry Zaitsev如果卡在任何地方,请告诉我

希望这可以帮助

于 2013-09-19T04:43:56.583 回答