Программное обеспечение вызвало прерывание соединения: ошибка записи сокета при очистке приложения из последнего списка (он работает в другом потоке от службы)

110
7

Я создал приложение, в котором у меня есть кнопка "Пуск", и когда я его нажимаю, он запускает службу клиентских потоков, в которой клиентский сокет подключается к моему компьютеру через серверный сокет, и он работает хорошо, пока приложение не будет очищено от последнего списка. То же самое не происходит, когда я нажимаю кнопку "Пуск" и выполняю finish() чтобы закрыть приложение. Служба работает в обоих случаях, но когда я очищаю приложение из последнего списка, Служба продолжает работать, но я получаю сообщение об ошибке в своем приложении "Программное обеспечение, вызванное отключением соединения: ошибка записи сокета". И когда я использую finish() чтобы закрыть приложение, он также очищается от недавнего списка, но он продолжает успешно работать службу без сокета, получая какую-либо ошибку.

Что я должен делать??

И извините за мой английский, это не мой родной язык.

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent serviceIntent = new Intent(getBaseContext(), ClientService.class);
}

//This is called when I click the start button
public void ServiceToggle(View v) {
if (!isServiceRunning(ClientService.class)) {
new Thread(new Runnable() {
@Override
public void run() {
startService(serviceIntent);
}
}).start();
} else {
new Thread(new Runnable() {
@Override
public void run() {
stopService(serviceIntent);
}
}).start();
}
}

ClientService.java

public class ClientService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onCreate();
handler = new Handler();
new Thread(new Client()).start();

return START_STICKY;
}

class Client implements Runnable {
String message;

@Override
public void run() {
try {
socket = new Socket(IP, PORT);

objectInputStream = new ObjectInputStream(socket.getInputStream());

while (true) {
message = (String) objectInputStream.readObject();

UpdateOnUI(message);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

public void UpdateOnUI(final String string) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show();
}
});
}
}

Ошибка выполняется с клиентской стороны (Android) не с серверной части (Windows) и отличается от других вопросов, заданных в переполнении стека. Эта ошибка возникает, когда приложение закрывается из Задачи, Служба продолжает работать, и сокет реализуется внутри Службы, также при закрытии операции, а не в Сервисе.

спросил(а) 2021-01-19T16:27:44+03:00 2 месяца, 3 недели назад
1
Решение
86

Он работает сейчас. Просто нужно, чтобы сервис работал в Foreground. Сделать это Передний план не работал раньше из-за глупой ошибки, я делал это в другом потоке, но забыл выполнить его (не вызывал.start()).

ответил(а) 2021-01-19T16:27:44+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема