2

请不要认为这是一个多余的问题。请完整阅读。

我在 AsyncTask 的 doInBackground(Void...params) 中有一个无限循环。doInBackground() 中有一个回调函数。因此,我无法使用 cancel()、onCancelled() 和 isCancelled() 方法终止此任务。问题是执行永远在回调函数处等待。因此,无论我在哪里(在 doInBackground 内)编写这个 isCancelled() 检查以跳出无限循环,它都不会被执行。

有没有人有解决这种问题的方法?或者有人有类似的要求吗?

@Override
protected void onCancelled()
{
    // Socket Close
}

@Override
    protected Void doInBackground(Void... params)
    {
        try
        {
            // Socket Open

            while (true)
            {

                socket.receive();
            }
        }
        catch (Exception e)
        {

        }
        return null;
    }
4

3 回答 3

1

您应该在您的 中使用超时socket.receive(),因此它会不时将控制权传递回AsyncTask,您可以在其中检查isCancelled()并终止循环。

于 2012-11-08T23:22:51.360 回答
1
        @Override
    protected void onCancelled()
    {
        // Socket Close
    }

    @Override
        protected Void doInBackground(Void... params)
        {
            try
            {
                // Socket Open

                while (!isCancelled())
                {

                    socket.receive();
                    OnProgressUpdate(...);
                }
            }
            catch (Exception e)
            {

            }
            return null;
        }
    @Override
        protected void onProgressUpdate(...) {
                receiveing=true;
            }

boolean receiveing;

由于我不知道您要达到什么目标,而且问题也不清楚,所以我不确定这是否是您要问的。您可以将 cancel() 放在您需要的地方。
无限循环不是一个好主意......

于 2012-11-08T23:35:11.467 回答
1

在开始任何接收操作之前,socket.setSoTimeout(int timeout)根据您的需要调用并给它一个超时时间(如果您通常等待数据等待一点时间,您可以使用 1000ms 或更短。如果接收数据可能需要很长时间,请使用更大的值,例如 10000 毫秒)。

然后,在您的循环中,在socket.receive方法之后,检查任务是否被取消(isCancelled() == true),如果是,则从循环中退出。

于 2012-11-08T23:42:23.513 回答