Android TCP连接的最佳实践

11

我正在开发一个Android应用程序,需要与一个TCP服务器(使用Node.js编写)建立TCP连接。

我的Android TCP客户端已经能够发送和接收消息。

我的具体问题是:

  1. 在Android中处理与服务器的TCP连接的最佳方法是什么?
  2. 如何维护连接(例如在onDestroy()中正确关闭连接)?
  3. 除了使用AsyncTask(不允许在Android 4.0中使用普通的Thread类)外,是否有更好的方法?

我的socket连接实现在AsyncTask中,像这样:

@Override
protected Void doInBackground(Void... params) {
        try {
            Log.d("TCP_MESSAGE", "Connecting...");

                socket = new Socket(MY_LOCAL_IP, 8080);
                dataOutput = new DataOutputStream(socket.getOutputStream());

                inputstream = new InputStreamReader(socket.getInputStream());
                input = new BufferedReader(inputstream);


            while (!canceled) {
                String message = input.readLine();
                handleMessage(message);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return null;
}

我之所以在AsyncTask中使用连接是因为我正在使用Android 4.0,不允许在常规线程中使用网络代码。


2
你是说在4.0中不允许使用Thread吗?那不是真的。但无论如何,请参阅我下面的答案。 - Tobias Ritzau
你关于4.0版本中有线程是错误的。你不能把网络代码放在线程中。 - m0skit0
好的。当我使用普通的Thread时,我遇到了一个异常(并发现其他指定了同样问题的线程)。但是我觉得这有点奇怪,所以我想你是对的。 - Emil
2个回答

6
一个服务应该拥有连接。如果您需要在应用程序不运行时保持连接,则应将其设置为前台服务。如果您没有将其设置为前台服务,请确保从活动中绑定到服务以使其保持活动状态。
不要忘记服务也在主(UI)线程上运行,因此您仍然需要一个单独的线程来处理通信。
如果您只有一个活动,并且只想处理由于配置更改而导致的重新启动,则可以自己处理配置更改,将连接保留给非 UI 片段,或者使用 onRetainNonConfigurationInstance()/getLastNonConfigurationInstance() 将连接传递给自己(但是这已被弃用,推荐使用片段)。

4
不,但他询问了保持连接的最佳方法,而这是一个服务,如果你想在活动和配置更改之间保持连接。 - Tobias Ritzau
1
在那种情况下保持连接的最佳方法 - m0skit0
1
你绝对不应该在 onDestroy() 中关闭连接,因为你无法确定它是否被调用。 - Tobias Ritzau
2
Tobias是正确的,当屏幕方向改变时,您不希望连接关闭,对吗? - user238033
一个服务似乎对于仅维护TCP连接来说有些过于笨重了。 - Michael
显示剩余2条评论

2
什么是在Android中处理与服务器的TCP连接的最佳方法?
这很大程度上取决于您的应用程序的复杂性以及您想要做什么。对于Android网络,没有具体的规定。
如何维护连接(在onDestroy()中正确关闭连接等)?
每当需要时打开套接字并将其保留为类字段。在调用onDestroy()时关闭它。确保首先检查它是否不为null
除了使用AsyncTask(除了Android 4.0中不允许的普通Thread类),还有更好的方法吗?
在Android 4.0(API14)中可以使用普通的Java线程。您可能会感到困惑:在Android中不允许在主线程(UIThread)中使用网络代码。

是的,我对Android 4.0中的线程有所误解。我在onDestroy()中关闭了连接,但关闭线程并不总是那么容易。但还是感谢您的回复。 - Emil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接