Я новичок в разработке Android, но не новичок в Java.Тема заставляет программу сбой
Одно золотое правило - никогда не блокировать нить графического интерфейса, ни главную нить.
Проблема, с которой я столкнулся, заключается в том, что мое приложение может отправлять сообщения на сервер, а сервер отображает сообщения. Когда мой сервер (ПК) отправляет сообщения обратно в мое приложение для Android, приложение получает сообщение, и это видно из-за log method
.
Консоль отображает сообщение, отправленное с сервера, но приложение GUI этого не делает, потому что оно зависает.
То, что я сделал, это установить нить, в другую сторону. `Main Thread> Thread (подключается к серверу)> Thread (прослушивает входящие сообщения)> Thread (Android Gui Thread).
Проблема здесь; программа зависает, и действие перестает отвечать. При этом консольное окно отображает сообщения, отправленные с сервера.
Мой вопрос: почему приложение замораживается, когда я не блокирую нити?
private void ConnectButtonPress() {
btnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnConnect.setVisibility(View.GONE);
btnDisconnect.setVisibility(View.VISIBLE);
btnSend.setEnabled(true);
enterET.setEnabled(true);
new Thread(new Runnable() {
public void run(){
try {
socket = new Socket(IPAddressET.getText().toString(), Integer.parseInt(portET.getText().toString())); //connect to server
input = new Scanner(socket.getInputStream());
pw = new PrintWriter(socket.getOutputStream(), true);
pw.println(usersName); //write the message to output stream
pw.flush();
new Thread(new Runnable() {
@Override
public void run() {
while (true){//this is where the problem is
try {
input = new Scanner(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
String message = input.nextLine();
Log.i("LOL",message);
runOnUiThread(new Runnable() {
@Override
public void run() {
String message = input.nextLine();
displayMessages.append(message +"\n");
}
});
}
}
}).start();
//pw.close();
//pw.close(); //closing the connection
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
По умолчанию в приложении для Android есть только один поток. Некоторые люди называют его потоком пользовательского интерфейса, но это плохая практика. Просто подумайте о единственном (основном) потоке как об обработке основного кода, а также о том, что нужно сделать с пользовательским интерфейсом. – Squonk