【问题标题】:Android TCP connection best practiceAndroid TCP 连接最佳实践
【发布时间】:2012-10-10 02:48:36
【问题描述】:

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

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

我的具体问题是:

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

我在 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 并且不允许在常规线程中使用网络代码。

【问题讨论】:

  • 你是说4.0不允许使用Thread?那不是真的。但无论如何,请参阅下面的答案。
  • 在 4.0 中使用线程是错误的。你不能做的是在 MAIN 线程中有网络代码。
  • 好吧。当我使用普通线程时出现异常(并发现了其他指定相同问题的线程)。但我确实认为这有点奇怪,所以我猜你是对的。

标签: android tcp tcpclient


【解决方案1】:

在 Android 中处理与服务器的 TCP 连接的最佳方式是什么?

这在很大程度上取决于您的应用程序的复杂性,以及您想用它做什么。 Android 网络没有具体细节。

如何保持连接(正确关闭连接) onDestroy() 等)?

当你跌倒时打开套接字并将其保留为类字段。在调用onDestroy() 时关闭它。确保您首先检查它是否不是null

有没有其他方法可以使用 AsyncTask(除了普通线程 类,在 Android 4.0 中是不允许的)

您可以在 Android 4.0 (API14) 中使用普通的 Java 线程。您可能会感到困惑:Android 中不允许在主线程 (UIThread) 中有网络代码。

【讨论】:

  • 是的,我对 Android 4.0 中的线程有误。我在 onDestroy() 上关闭了我的连接,但关闭线程并不总是那么容易。不过谢谢你的回复。
【解决方案2】:

服务应该拥有连接。如果您需要在应用程序未运行时保持连接,那么您应该将其设为前台服务。如果您不使其成为前台服务,请确保从您的活动中绑定到该服务以使其保持活动状态。

不要忘记该服务也在主 (UI) 线程上运行,因此您仍然需要一个单独的线程来处理通信。

如果您只有一个活动并且只想处理由于配置更改而重新启动,那么您可以自己处理配置更改,保持连接由非 UI 片段拥有,或者使用 onRetainNonConfigurationInstance() 将连接传递给自己/getLastNonConfigurationInstance() (但不推荐使用它以支持使用片段)。

【讨论】:

  • 我不知道你为什么说服务。他没有在任何地方提到服务,或者他谈到在应用程序死机时保持连接。事实上,他表示他希望在 onDestroy() 回调中销毁连接...
  • 没有,但他询问了保持连接的最佳方式,如果您想在活动和配置更改之间保持连接,那就是服务。
  • 在那种情况下保持连接的最佳方式
  • 你绝对不应该关闭onDestroy()中的连接,因为你永远不知道它是否被调用。
  • Tobias 是对的,您不希望在屏幕方向更改时关闭连接,是吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 2016-02-26
  • 2015-08-03
  • 2022-07-08
  • 2011-07-04
  • 2013-07-07
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多