只是想知道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);
}
答案 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。从一个版本到另一个版本的实现可能会有所不同。