Оптимизация подключения к TCP-сети Android

Я работаю над приложением Android, которому требуется TCP-соединение с TCP-сервером (написано в Node.js)

Мой Android-клиент TCP работает, он может отправлять сообщения туда и обратно.

Мои вопросы:

  • Каков наилучший способ обработки TCP-соединения с сервером на Android?
  • Как поддерживать соединение (правильно закрыть соединение на onDestroy() и т.д.)?
  • Есть ли какой-либо вариант, который использует 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 и не имею права иметь сетевой код в регулярном потоке.

Ответ 1

Служба должна иметь соединение. Если вам нужно поддерживать соединение, пока приложение не работает, вы должны сделать его передним планом. Если вы не делаете его передним, убедитесь, что привязаны к службе из своих действий, чтобы сохранить ее.

Не забывайте, что служба также работает в основном потоке (UI), поэтому для обработки связи вам все еще нужен отдельный поток.

Если у вас есть только одно действие и вы просто хотите обрабатывать перезагрузки из-за изменений конфигурации, вы можете самостоятельно отредактировать изменения конфигурации, сохранить соединение, принадлежащее фрагменту non-ui, или передать соединение себе, используя onRetainNonConfigurationInstance()/getLastNonConfigurationInstance() (однако это устарело в пользу использования фрагментов).

Ответ 2

Каков наилучший способ обработки TCP-соединения с сервером на Android?

Это сильно зависит от сложности вашего приложения и того, что вы хотите с ним делать. Специфических для Android сетей нет.

Как поддерживать соединение (правильно закрыть соединение onDestroy() и т.д.)?

Откройте сокет, когда вы упадете, и сохраните его как поле класса. Закройте его, когда вызывается onDestroy(). Убедитесь, что вы сначала проверяете null.

Есть ли какой-либо вариант, используя AsyncTask (за исключением обычного потока класс, который не разрешен в Android 4.0)

Вы можете использовать обычные потоки Java в Android 4.0 (API14). У вас может быть путаница: то, что запрещено в Android, имеет сетевой код в основном потоке (UIThread).