Android:取消Async-Task并重新启动它

时间:2015-05-15 17:20:26

标签: android asynchronous tcpclient

我编写了一个应用程序,通过tcp / ip连接到我的服务器。 (从教程中获取原始代码,但更改了它)

我有一个Async-Task,我连接到我的服务器并等待消息。 所以这个任务永远不会停止。

我从以下开始:

conTask = new ConnectTask().execute("");

任务看起来像这样:

public class ConnectTask extends AsyncTask<String, String, TcpClient> {

    @Override
    protected TcpClient doInBackground(String... message) {

        if (isCancelled()) {
            Log.d("async", "ASYNC CANCELED!!!");
            return null;
        }

        //we create a TCPClient object and
        mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {

            @Override
            public void reconnect()
            {
                Log.d("recon", "here i can try to reconnect");

                reConnect();
            }

            @Override
            //here the messageReceived method is implemented
            public void messageReceived(String message) {
                //this method calls the onProgressUpdate
                if (message.equals("connected"))
                {
                    ...
                }
            }
        });

        mTcpClient.run();

        return null;
    }
}

问题是,当连接失败或中断时,我尝试重新连接。 如果发生这种情况,我的TcpClient-Instance调用reconnect() - 我从我的Mainclass调用reConnect() - Method的方法,我尝试杀死Async-Task并重新启动它:

    conTask.cancel(true);
    conTask = null;

    // disconnect
    mTcpClient.setMRun(false);
    mTcpClient.stopClient();
    mTcpClient = null;

   conTask = new ConnectTask().execute("");

它工作正常,但突然重新连接时,应用程序停止运行,我不知道为什么。它会重复调用reconnect-Method,例如WLAN关闭时。如果我快速打开它,它就可以工作。但如果我等了太久,该应用程序已经崩溃了。

所以我的最后一个问题是:如何从内部停止Async-Task并重新启动它?显然我做错了。

我会感激一些帮助!

2 个答案:

答案 0 :(得分:0)

您遇到的问题是,您只能在if (isCancelled())开头调用doInBackground()

我会假设您希望在调用reconnect()方法时成功取消?

在这种情况下,请尝试将reconnect()方法的所有内容封装在if (ConnectTask.this.isCancelled() != true)中,然后您可以选择从该方法返回。

答案 1 :(得分:0)

实际上,从您的代码中AsyncTask.cancel()执行任务都不会有任何好处。此方法将导致isCancelled返回true,并且它应该在doInBackground中充当循环断路器。您没有运行任何循环,您的代码将不会返回到该条件检查。

所以,如果我是你,我首先会评估是否需要使用AsyncTask,因为它看起来只是用它来启动mTcpClient。从它的外观来看,它已经异步运行,因为你附加了回调。 AsyncTask 异步任务,所以没有必要在已经异步运行的东西上包装AsyncTask。显然,最初的目标不是取消AsyncTask而是取消这个事情。如果确实需要AsyncTask,那么我将限制进程内部的生命周期。我不会使用异步但同步的方法将结果传递给onPostExecute,或者只是在doInBackground中结束它。在取消不可能的情况下,取消AsyncTask唯一要做的就是让它自己结束。