Android TCP连接最佳实践

时间:2012-10-19 13:15:56

标签: android tcp tcpclient

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

我的Android TCP客户端正在工作,可以来回发送消息。

我的特殊问题是:

  1. 在Android中处理与服务器的TCP连接的最佳方法是什么?
  2. 如何维护连接(在onDestroy()等上正确关闭连接?)
  3. 有没有更好的方式然后使用AsyncTask(除了普通的Thread类,Android 4.0中不允许)
  4. 我在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 个答案:

答案 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 )。