Оптимизация подключения к 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).