onCancelled()在冰淇淋三明治中看起来有所不同

时间:2011-12-22 16:58:29

标签: android android-asynctask

只是想知道IceCream Sandwich发生了什么......

我从服务器获得了一个简单的AsyncTask读数据。单击断开连接按钮后,调用lServerTask.cancel(true);成功调用onCancelled(),设置m_Running = false;从而突破{{1}中的while循环}。

使用我的Galaxy Nexus,我点击断开连接按钮,但任务不会退出。并且仍然连接到服务器。有没有人有任何想法?

非常感谢

标记

代码FYI -

protected void doInBackground(Void...params)

并从UI方面:

        // automatically done on worker thread (separate from UI thread)
    protected Void doInBackground(Void...params) 
    {
        while(m_Running)
        {
            try 
            {
                lRDS.readSocket();
            } 
            catch (IOException e) 
            {
                lRDS.disconnectFromServer();
                publishProgress(e.toString());
                return null;
            }

            lDataBuffer = lRDS.getDataBuffer();    

            publishProgress(lDataBuffer);

        }
        return null;
    }

    @Override
    protected void onCancelled() 
    {
        m_Running = false;
        connectRDSButton.setEnabled(true);
        disconnectRDSButton.setEnabled(false);
    }

2 个答案:

答案 0 :(得分:0)

好吧,我似乎发现了这个问题。我需要在doInBackground()方法的while循环中检查isCancelled(),然后从那里调用onCancelled()方法。不知道为什么我没有把这看作是关于HTC欲望的Android 2.2的问题。

protected Void doInBackground(Void...params)

{

while(m_Running)
{
    if (isCancelled () == true)
    {
        onCancelled();
    }

希望这有助于某人。

标记

答案 1 :(得分:0)

取消AsyncTask有两种方法:

  • 检查isCancelled方法中的doInBackground,尝试尽快终止。
  • 调用cancel(true),然后AsyncTask的后台线程将被中断。为此,您需要在Thread.sleep方法中策略性地发出doInBackground次来电,当您抓住InterruptedException时,就会返回。

在这两种方法中,后者是迄今为止最不可靠的方法,因为对方法的任何调用除了你的方法之外都会捕获InterruptedException将导致取消。例如,如果您调用吞噬异常的SystemClock.sleep等方法,则永远不会遇到catch子句。

在这两种情况下,isCancelled次检查或Thread.sleep次来电之间的长时间操作都将完成。

现在关于你的问题,你正在使用第二种方法,但是没有任何Thread.sleep调用,所以它不会工作,除非你调用的一些方法捕获了Interrupted异常并抛出了IOException。从一个版本到另一个版本的实现可能会有所不同。