3

我有一段代码使用 AsyncTask 在后台运行。代码与此类似:

private class MyAsyncTask extends AsyncTask<Void, Void, Object> {

    public MyAsyncTask() {
        // Some init. code
    }

    @Override
    protected Object doInBackground(Void... params) {
        // Doing some long running task.
        Log.v(TAG, "Finished everything. Returning ...");
        return result;
    }

    @Override
    protected void onCancelled(Object result) {
        // Either way, run the next one in the line.
        Log.v(TAG, "Task cancelled");
    }

    @Override
    protected void onPostExecute(Object result) {
        Log.v(TAG, "Task Completed.");
    }

}

在 Android 4 上它工作得很好,但是当我在 2.3 上运行它(HTC Wildfire 是我目前唯一的测试手机)时,不会调用 onPostExecute。

我可以看到来自 的最后一条消息doInBackground,但没有来自onCancelled或的消息onPostExecute。有没有其他人面临同样的问题?我发现这个链接讨论了一个类似的问题,但既没有给出明确的解决方案(只是建议使用普通线程而不是AsyncTask),也不是我正在寻找的。

有什么建议么?

干杯

编辑1:

好的,在花了一天时间阅读了 , 和 2.3 和 4 的代码之后AsyncTaskHandlerMessage现在对正在发生的事情有了更多的线索。

首先多一点关于我的设计。我有一个单例类,它既可以在应用程序中使用,也可以在从我的应用程序启动的某些服务中使用。所以AsyncTask我上面展示的代码既可以从活动中运行(假设单例是通过活动访问的),也可以从服务中运行(如果单例是通过服务访问的)。

现在在 API 11+ 中,无论单例如何访问,onPostExecute都可以正常调用。在 API 10 及以下版本中,如果从 Activity 访问单例,则onPostExecute可以正常调用,但如果通过服务访问,onPostExecute则不会调用。

这是有关卡住位置的更多详细信息。AsyncTask在 2.3 上有一个FutureTask覆盖done函数以将 a 发送Message到其内部Handler,如下所示:

        mFuture = new FutureTask<Result>(mWorker) {
        @Override
        protected void done() {
            Message message;
            Result result = null;

            try {
                result = get();
            } catch (final InterruptedException e) {
                android.util.Log.w(AsyncTask.LOG_TAG, e);
            } catch (final ExecutionException e) {
                throw new RuntimeException("An error occured while executing doInBackground()",
                        e.getCause());
            } catch (final CancellationException e) {
                message = AsyncTask.sHandler.obtainMessage(AsyncTask.MESSAGE_POST_CANCEL,
                        new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
                message.sendToTarget();
                return;
            } catch (final Throwable t) {
                throw new RuntimeException("An error occured while executing "
                        + "doInBackground()", t);
            }

            message = AsyncTask.sHandler.obtainMessage(AsyncTask.MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result));
            message.sendToTarget();
        }
    };

以下代码的最后两行调用message.sendToTarget了应该调用handleMessageHandler类,但事实并非如此!现在我不知道为什么对处理程序的回调发生在活动而不是服务中!我有一些解决方案如何解决这个问题(只是在我的代码中始终使用 API15+ 的 AsyncTask 类),但是任何关于这个原因的解释都将非常感激,因为我对此一无所知!

谢谢

4

1 回答 1

-2

官方文档很详细,试试看。

请检查此链接它可能对您有所帮助

http://foo.jasonhudgins.com/2010/05/limitations-of-asynctask.html

好的~注意:

onCancel 函数在您调用 cancel(boolean) 方法时执行。你有没有调用这个函数?

于 2012-12-16T03:08:50.463 回答