0

我正在使用这个例子:

Android - 为 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() 被调用......这怎么可能?

显然,我对异步任务超时非常陌生——经过一些研究,我发现上面的例子对我来说似乎最有意义,肯定比 loader.get(15000, TimeUnit.MILLISECONDS); 更有意义,因为那会阻塞用户界面线程。

任何帮助表示赞赏......甚至是对过程的解释..

4

1 回答 1

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();
    }
于 2013-03-24T20:40:41.600 回答