为了找到Handler没有停止AsyncTask的原因而苦苦挣扎

时间:2013-03-24 19:26:58

标签: debugging android-asynctask timeout

我正在使用这个例子:

Android - Setting a Timeout for an AsyncTask?

以下列方式:

al.setOnClickListener(new OnClickListener(){
        public void onClick(View w)
        {
            final AlogLoader loader = new AlogLoader();
            loader.execute();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable()
            {
                public void run()
                {
                    if(loader.getStatus() == AsyncTask.Status.RUNNING)
                    {
                        loader.cancel(true);
                    }
                }

            }, 1);      
        }
    });

我将它设置为“1”因为我想看看我是否可以在它开始之前实际停止它 - 看看我的处理程序是否正常工作 - 实际上我可能会将它设置为15000(15秒)。

然而,会发生什么令人困惑:

运行应用程序会导致我的onPreExecute()绘制一个加载屏幕,该屏幕不会退出,因此用户只能看到一个加载屏幕。

在调试器中使用loader.cancel处的断点运行它(true) - >导致调试器停在该行,这是预期的,因为它只允许运行1毫秒。但是,当我在调试器中点击恢复按钮之后 - 我的onPostExecute()被调用... 这怎么可能?

很明显,我很快就会对asynasasks进行计时 - 经过一些研究后,我找到了上面的例子,它似乎对我来说最有意义,当然更多 loader.get(15000,TimeUnit.MILLISECONDS);,因为它会阻止UI线程。

感谢任何帮助...甚至对流程的解释......

1 个答案:

答案 0 :(得分:0)

好, 所以我基本上解决了我的问题,但我仍然感到困惑......不知道这是否一切都好。

我不清楚loader.cancel(true)实际上是如何工作的。基于API级别(请阅读此问题:AsyncTask.onCancelled() not being called after cancel(true)),您需要在AsyncTask中使用onCancelled()或onCancelled(params)方法,或两者​​兼而有之。

我没有这个,所以这就解释了为什么我永远看到了加载屏幕。好的。

然而,它没有解释如何在调试器中,我设法仍然调用onPostExecute(),因为根据Android API,一旦调用cancel(true),onPostExecute永远不会被调用...

答案是: 将此添加到您的AsyncTask -

    @Override
    protected void onCancelled()
    {
        Toast.makeText(FriendsActivity.this,"Blah- reason", Toast.LENGTH_LONG).show();
        loadingScreen.dismiss();
    }