Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

И снова сокеты в java android

Я хотел бы спросить про сокеты в 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().

Комментариев нет:

Отправить комментарий