我正在开发一个需要与TCP服务器建立TCP连接的Android应用程序(以Node.js编写)
我的Android TCP客户端正在工作,可以来回发送消息。
我的特殊问题是:
我在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,并且不允许在常规线程中使用网络代码。
答案 0 :(得分:6)
服务应该拥有该连接。如果您需要在应用程序未运行时保持连接,则应将其作为前台服务。如果您不将其作为前台服务,请确保从您的活动绑定到该服务以使其保持活动状态。
不要忘记该服务也在主(UI)线程上运行,因此您仍然需要一个单独的线程来处理通信。
如果您只有一个活动并且只想处理由于配置更改而导致的重新启动,那么您可以自己处理配置更改,保持连接由非ui片段拥有,或者使用onRetainNonConfigurationInstance()将连接传递给您自己/ getLastNonConfigurationInstance()(但不赞成使用片段)。
答案 1 :(得分:2)
在Android中处理与服务器的TCP连接的最佳方法是什么?
这在很大程度上取决于您应用的复杂程度以及您想要使用它做什么。 Android网络没有具体细节。
如何保持连接(正确关闭连接 onDestroy()等)?
每当你跌倒时打开套接字并将其保留为类字段。调用onDestroy()
时关闭它。请务必先检查它是否null
。
有没有更好的方法然后使用AsyncTask(普通线程除外) class,在Android 4.0中不允许)
您可以在Android 4.0(API14)中使用普通的Java线程。您可能会感到困惑:Android中不允许的是在主线程中使用网络代码( UIThread )。