У меня проблемы с чтением / записью на tcp сервер, для которого я собираю приложение. В недавней ветке мне предложили использовать службу вместо этого, но это проект для школы, в котором предлагался asyncTask, так что я мог бы также пойти на это.
Итак, классы, которые я получил, - это мой класс активности и асинхронный, в активности ничего интересного не происходит, кроме отправки строки, которая работает так плохо, что с асинхронным не получается.
class ServerTask extends AsyncTask<Void, Void, Void>{
public static String ip = "10.0.2.2";
public static int port = 2002;
Socket socket;
public DataInputStream dis;
public DataOutputStream dos;
public String message;
@Override
protected Void doInBackground(Void... params) {
try {
socket = new Socket(ip, port);
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
} catch (Exception e) {
Log.i("AsyncTank", "Cannot create Socket");
}
while(socket.isConnected()){
read();
}
}
}
return null;
}
public void write(String message) {
try {
if (socket.isConnected()){
dos.writeUTF(message);
dos.flush();
} else {
Log.i("AsynkTask", "Socket appears to be closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "Writing failed");
}
}
public String read() {
try {
if (socket.isConnected()) {
message = dis.readLine();
} else {
Log.i("AsyncTask", "Cannot read");
}
} catch (Exception e) {
Log.i("AsyncTask", "Cannot read from stream");
}
return message;
}
}
Вещи, которые я знаю, сервер получает сообщения, но не обновляет, пока я не перезапущу сервер, что заставляет меня поверить, что я не нажимаю новую строку или что-то, что заставляет все это выглядеть как одна строка после ее закрытия. Тем не менее, это может быть и сервер, за который я не отвечаю, так что плохо читать в этом.
Однако часть чтения не хочет работать, я не уверен, как вызвать метод, чтобы он постоянно слушал и реагировал на серверы sockt? Я пытался создать поток непосредственно перед возвратом в doInBackGround, но затем приложение запускается работает в течение нескольких секунд, сила закрывается из-за нехватки памяти? Нужна ли мне тема, чтобы постоянно слушать?
Весь смысл этого, как вы можете догадаться, состоит в том, чтобы создать чат, чтобы метод read в конечном итоге должен был обновить textView в моем классе активности. Метод send «работает», но не так, как должен, хотя это может быть, как я уже говорил ранее, сервер делает что-то напуганное.
Еще один, возможно ли вообще иметь чтение как метод, как у меня, или что-то должно реагировать, когда сервер отправляет данные и затем вызывает метод?
Редактировать
Теперь я переместил часть чтения или, по крайней мере, часть из нее в doInBackGround, так что теперь она
dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
message = dis.readLine();
Log.i("AsynkTask", "Read : "+message+" this is doInBackGround!");
Это, наряду с изменением простого жесткого кода линии печати на сервере, заставило меня прочитать эту строку в клиенте, так что я предполагаю, что сейчас она работает действительно хорошо.
Как это выглядит? Это полная чушь этот код и должно быть сделано как-то иначе? Получил мою функциональность, но никогда не плохо учиться, чтобы сделать это лучше, так сказать:).