1

我试图取消一个 RequestAsyncTask,当我调用方法取消时,后台线程不会停止,因为 isCancelled 方法永远不会被调用,我该怎么做?这是我的代码:

Request requestUpload = Request.newUploadPhotoRequest(session, imagen, requestCallback);
        Bundle params = requestUpload.getParameters();
        params.putString("name", "hi everyone");
        requestUpload.setParameters(params);
        rq = Request.executeBatchAsync(requestUpload);
        progressDialog = ProgressDialog.show(getActivity(), "", "Wait please...", true, true, new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                if (rq != null) {
                    rq.cancel(true);                           
                }
            }
        });
4

1 回答 1

0

有几件事:

首先,我不确定您如何编译该代码,因为我希望 rq 必须是 final 才能在匿名 OnCancelListener 方法中被引用。当我在我的环境中复制它时,它当然必须这样做。

其次,我不确定你的意思

因为 isCancelled 方法永远不会被调用

调用此方法是为了确定任务是否被取消,而不是取消它。

第三,我编写了类似的代码(如下),它显示当使用后退按钮取消对话框时,对 isCancelled 的调用返回 true。

最后,编写的代码将无限期地显示您的进度对话框,而您(可能)希望在请求完成时将其关闭。一种方法是创建 RequestAsyncTask 的子类,并重写其 onPostExecute 方法以关闭 ProgressDialog。

Bundle postParams = new Bundle();
postParams.putString("name", "Name");
postParams.putString("message", "Message");
postParams.putString("picture", imageURL);

Request request = new Request(fbSession, "me/feed", postParams, HttpMethod.POST, postResponseCallback);
final FacebookPostTask task = new FacebookPostTask(request);
task.execute();

facebookPostProgressDialog = ProgressDialog.show(this, "", "Posting to Facebook...", true, true,
    new DialogInterface.OnCancelListener() {
      @Override
      public void onCancel(DialogInterface dialog) {
        if (task != null) {
          task.cancel(true);
          Log.d(MainActivity.TAG, "Task cancelled? " + task.isCancelled());
        }
      }
    });

RequestAsyncTask 的子类如下所示:

  private class FacebookPostTask extends RequestAsyncTask {

    public FacebookPostTask(Request... requests) {
      super(requests);
    }

    @Override
    protected void onPostExecute(List<Response> result) {
      super.onPostExecute(result);
      facebookPostProgressDialog.dismiss();
    }

  }

可能有更简单的方法可以做到这一点。

请注意,即使我成功取消了任务,FB 帖子似乎也继续进行。这可能只是我取消的速度。

于 2013-04-25T15:12:32.500 回答