Я хотел бы спросить про сокеты в Android. Я перерыл половину интернета и не нашел того, что мне нужно.
Задача написать клиент под Android на Java, который бы отправлял и получал сообщения. Когда писал на компьютер, все было чудесно, тут же столкнулся с проблемой многопоточности (нельзя вызывать сетевые задачи из главного потока). Я более менее разобрался, заставил отправлять сообщения на сервер, но никак не получается сделать, чтобы TextView сам принимал и обновлял историю диалога.
Вот код клиента, сервер даже переписал как простой эхо сервер, отсылает обратно то, что отправил клиент. Ниже код клиента, помогите с реализацией приема сообщений от сервера.
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
private Socket socket;
private Button SendBut;
private EditText editText;
private TextView textView;
private PrintWriter os;
private BufferedReader is;
networking net;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SendBut = (Button) findViewById(R.id.SendBut);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.TxtFrSrv);
net = new networking();
net.execute();
}
public void onClck(View view) {
String txt = null;
txt = editText.getText().toString();
os.println(txt);
}
public class networking extends AsyncTask < String, Void, Void > {
@Override
protected Void doInBackground(String...params) {
try {
socket = new Socket("10.0.2.2", 4444);
os = new PrintWriter(new PrintWriter(new OutputStreamWriter(socket.getOutputStream())), true);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
Пытался изобразить что то похожее на это, но с нулевым значение запустить не получается...
public class getMsg extends Thread{
public void run(){
try {
is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
final String finc;
finc=is.readLine();
while (!finc.equals("break")){
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(finc);
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ответ
public void GetMsg(){
new Thread(new Runnable() {
@Override
public void run() {
try {
socket=new Socket(Host,4444);
} catch (IOException e) {
e.printStackTrace();
}
try{
is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while (true){
String msg = null;
try {
msg=is.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (msg==null){
break;
}
else {
displayMsg(msg);
}
}
}
}).start();
}
public void displayMsg(String msg){
final String msg1 = msg;
handler.post(new Runnable() {
@Override
public void run() {
appendTextAndScroll(msg1);
}
});
}
Всем большое спасибо за помощь, я немного переделал клиент и решил данную проблему вот таким кодом, надеюсь кому-нибудь это будет полезно. Метод GetMsg вызываю в onCreate().
Комментариев нет:
Отправить комментарий