Android Von einem Thread auf anderen zugreifen

ATKA-Soft

Mitglied
Hi,
ich bin gerade dabei nen kleinen Chat mit Android zu programmieren und hab dabei Probleme mit dem Client.
Nachdem ich herausgefunden habe, dass man die Sockets und das ganze Netzwerkgedöns nicht in den Mainthread packen darf, habe ich ne zweite Klasse angelegt die Runnable implementiert und diese mit dem ganzen Netzwerkzeug drin in nem neuen Thread gestartet. Problem ist jetzt nur, dass ich von der Main Klasse jetzt nicht mehr auf den Netzwerk-Klassen-Thread zugreifen kann.
Sprich, wenn auf den Button gedrückt wird, soll der Text aus einem EditText verschickt werden. Geht leider nicht so einfach, da der GUI Kram im Mainthread ist, und der Netzwerk Kram im Netzwerk-Klassen-Thread. Ebenso bei der Ausgabe von empfangenen Nachrichten vom Server in nem TextView.

Daher meine Frage, wie kann ich es machen, dass die beiden Threads gegenseitig aufeinander zugreifen können.

Mainclass:
Code:
protected void onCreate() {
    Button b = (Button)findViewById(R.id.button1);
    b.setOnClickListener(new OnClickListener() {
    
    @Override
    public void onClick(View v) {
        Thread connThread =new Thread(new Connection());
        connThread.start();
        Connection con = new Connection();
        con.send("<|cldt|name|"+n+"|>");
    });
}

public void newMsg(String msg){
    Toast.makeText(getBaseContext(), "Message: "+msg, Toast.LENGTH_SHORT).show();
    System.out.println("Message: "+msg);
}

Connectionclass:
Code:
public class Connection implements Runnable{

	Socket client;
	BufferedReader reader;
	PrintWriter writer;
	public Connection (){
		
	}
	
	

	@Override
	public void run() {
		try {
			String server =InetAddress.getByName("MyServer").getHostAddress().toString();
		    client = new Socket(server, 8000);
		    System.out.println("Connected");
		    InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
		    reader = new BufferedReader(streamReader);
		    writer = new PrintWriter(client.getOutputStream());
		    
		    Thread readerThread = new Thread(new recive());
		    readerThread.start();
		 
		} catch (UnknownHostException e) {
		     e.printStackTrace();
		} catch (IOException e) {
		     e.printStackTrace();
	    }		
	}
	
	public void send(String msg){
		System.out.println("Send");
		try {
			writer.println(msg);
			writer.flush();
			System.out.println("Message Send");
		} catch (Exception e){
			e.printStackTrace();
		}
	}
	
	public class recive implements Runnable {

		@Override
		public void run() {
			System.out.println("Reading");
			String msg;
			MainActivity main = new MainActivity();
			try {
				while ((msg=reader.readLine()) != null) {
					main.newMsg(msg);
				}
			}catch (Exception e) {
				e.printStackTrace();
			}
			
		}
		
	}

}

So weit mein Code, funktioniert aber nicht. Ich hoffe mir kann hier jemand helfen.
 

Michel95

Mitglied
Hi,

das gleiche Problem hatte ich auch, wenn auf ein View aus einem anderen Thread zugreifen willst, kannst du das mit der post()-Methode machen:

Java:
deinView.post(new Runnable() {
   public void run() {
       deinView.setText("neuer Text");
   }
})

Ebenfalls kannst du eine Implementierung der Klasse
Code:
AsyncTask
verwenden, dazu habe ich mir diesen Link angeschaut:
Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial
 

ATKA-Soft

Mitglied
Danke für die Antwort, ich hab mir jetzt mal das ganze da zu den AsyncTasks durchgelesen und es damitgemacht. Leider klappt es jetzt immer noch nicht.Er connected zwar und mein Server zeigt mir dass auch an, aber wenn ich einen Text absende, crasht die App.

Woran liegt es bzw. was sollte ich anderst machen? (Tschuldigung, dass ich das so blöd frage, aber nach 1 1/2 Stunden grübeln, komm ich irgendwie gar nicht mehr weiter ;( )
Code:
public class MainActivity extends Activity implements android.view.View.OnClickListener {
	
	private TextView MessageView;
	private Button button;
	private EditText input;
	Socket sock;
	BufferedReader reader;
	PrintWriter writer;
	


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        MessageView = (TextView)findViewById(R.id.Textfield);
        MessageView.append("Hello User \n");
        
        input=(EditText)findViewById(R.id.editText1);
        
        button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(this);        
        
        int corePoolSize = 60;
	int maximumPoolSize = 80;
	int keepAliveTime = 10;

	BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(maximumPoolSize);
		Executor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);
        new connect().executeOnExecutor(threadPoolExecutor);
    }
    
	@Override
	public void onClick(View v) {
		int corePoolSize = 60;
		int maximumPoolSize = 80;
		int keepAliveTime = 10;

		BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(maximumPoolSize);
		Executor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);
		new send().executeOnExecutor(threadPoolExecutor);
	}
	
	class connect extends AsyncTask<Void,Integer,String>{

		@Override
		protected String doInBackground(Void... params) {
			String t="";
			try {
				String server =InetAddress.getByName("jarves-server.no-ip.info").getHostAddress().toString();
				sock= new Socket(server, 8000);
				InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
				reader= new BufferedReader(streamReader);
				writer= new PrintWriter(sock.getOutputStream());
				
				
				int corePoolSize = 60;
				int maximumPoolSize = 80;
				int keepAliveTime = 10;

				BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(maximumPoolSize);
				Executor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);
				new send().executeOnExecutor(threadPoolExecutor);
				//new receive().executeOnExecutor(threadPoolExecutor);				
			} catch (Exception e) {
				System.out.println(e.toString());
			}
			
			return t;
		}
		
		@Override
		protected void onPostExecute(String v){
			MessageView.append("Connected");
		}
	}
	
	class send extends AsyncTask<Void, Integer, String>{
		String sendmsg;
		
		@Override
		protected void onPreExecute(){	
			sendmsg=input.getText().toString();
			input.setText("");
			input.requestFocus();
		}
		
		@Override
		protected String doInBackground(Void... arg0) {
			writer.write(sendmsg);
			writer.flush();
			return sendmsg;
		}
		
		@Override
		protected void onPostExecute(String v){
			MessageView.append("\n Me: "+v);
		}
		
	}
	
	class receive extends AsyncTask<Void, Integer, String>{
		String msg;
		
		@Override
		protected String doInBackground(Void... params) {
			try {
				msg=reader.readLine();
			} catch (Exception e) {
				System.out.println(e.toString());
			}
			return msg;
		}
		
		@Override
		protected void onPostExecute(String v){
			MessageView.append("Server: "+v);
		}
		
	}
    
}
 

dzim

Top Contributor
Ok. Ein paar Sachen vorweg:
1) Es gibt im Forum eine Suchfunktion. Der Thread, den Michael95 meint, ist noch unter den ersten im Abschnitt "Mobile Geräte" gewesen...
2) Verwende kein System.[out|err].* - Es gibt die Klasse android.util.Log mit den statischen Methoden #e (error), #w (warning), #d (debug), #i (info), #v (verbose) und für die ganz kniffligen Probleme #wtf (kein Scherz)
3) Bei einem Crash ist der Code zwar schon mal gut, aber idealerweise lieferst du auch einen Stacktrace. Das macht es noch einfacher.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Android Auf ImageView aus einem anderen Thread zugreifen liefert Fehlermeldung (App stürzt ab) Android & Cross-Platform Mobile Apps 5
AllBlack Auf der Suche nach einem App-Entwickler Android & Cross-Platform Mobile Apps 1
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
ruutaiokwu Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
L Eingaben in der MainActivity einem Service übergeben Android & Cross-Platform Mobile Apps 0
M mehrere URLs in einem AsyncTask abarbeiten Android & Cross-Platform Mobile Apps 2
M Android App → Problem mit dem Speichern von einem Bitmap–Objekt. Android & Cross-Platform Mobile Apps 1
Alex/89 ImageView mit einem Bild von der SD Karte füllen Android & Cross-Platform Mobile Apps 5
G GPS in einem Service abfragen Android & Cross-Platform Mobile Apps 2
J wie sicher ist der Quellcode in einem apk? bzw wie schützt man ihn? Android & Cross-Platform Mobile Apps 6
B Android In einem View der ersten Activity zweite anzeigen Android & Cross-Platform Mobile Apps 2
W Android Bestimmen von welchem Typ die Objekte in einem ArrayAdapter sind Android & Cross-Platform Mobile Apps 3
X Android Befehle an einem PC-Programm schicken Android & Cross-Platform Mobile Apps 4
N Textview macht immer nach einem Beistrich einen Abstand Android & Cross-Platform Mobile Apps 6
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
B Programm aus einem Buch funzt nicht! Android & Cross-Platform Mobile Apps 16
B Zeilen zählen in einem Textfile Android & Cross-Platform Mobile Apps 1
G Schriftgröße in einem TextField ändern Android & Cross-Platform Mobile Apps 2
A Problem beim Subtrahieren eines Double von einem Double Android & Cross-Platform Mobile Apps 5
U ein texteingabefeld auf einem Canvas . Android & Cross-Platform Mobile Apps 2
M Java Midlet -> in einem ChoiceGroup ein TextField zur Wah Android & Cross-Platform Mobile Apps 2
G Java Programme auf einem PDA Android & Cross-Platform Mobile Apps 1
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
A Von verschiedenen Klassen auf Thread zugreifen Android & Cross-Platform Mobile Apps 2
M Android Stop Swipe Refresh aus anderem Thread Android & Cross-Platform Mobile Apps 2
ms_cikar Thread / Intent als externe klasse Android & Cross-Platform Mobile Apps 1
G Thread in einer Service erstellen Android & Cross-Platform Mobile Apps 0
M App Programmierung: Thread starten und Variablenwerte oder Objekte mitgeben Android & Cross-Platform Mobile Apps 2
C new Thread oder setRunning = true/false Android & Cross-Platform Mobile Apps 12
C Auf innere (Thread)Klasse zugreifen, von anderer Klasse aus Android & Cross-Platform Mobile Apps 3
S Android Kommunikation zwischen UI -> Service -> Thread Android & Cross-Platform Mobile Apps 4
G Pause ohne sleep und ohne zweiten Thread Android & Cross-Platform Mobile Apps 5
G Pause im Programmablauf ohne extra Thread Android & Cross-Platform Mobile Apps 2
JAVAnnik Android Layout ändern in Thread Android & Cross-Platform Mobile Apps 2
Gossi Android Gossis Android Fragen Thread Android & Cross-Platform Mobile Apps 3
H Android ListView Images aus dem Internet via Thread Android & Cross-Platform Mobile Apps 3
L Android Thread Android & Cross-Platform Mobile Apps 4
Kidao Wie startet man ein Thread richtig? Android & Cross-Platform Mobile Apps 4
G Thread und Midlet Android & Cross-Platform Mobile Apps 1
M Activity einer anderen App mit result Android & Cross-Platform Mobile Apps 2
J Android Zugriff auf eine Datei, diese von einer anderen App erstellt wurde? Android & Cross-Platform Mobile Apps 11
F Projekt mit GIT auf anderen Rechner umgezogen Android & Cross-Platform Mobile Apps 2
L Android Marker mit Icons versehen und mit anderen icons clustern lassen Android & Cross-Platform Mobile Apps 0
H Android Aufrufen von "setContentView" in einer anderen Klasse Android & Cross-Platform Mobile Apps 3
S Auf Methode zugreifen von anderen Klassen Android & Cross-Platform Mobile Apps 6
G eine Methode einer anderen Activity aufrufen Android & Cross-Platform Mobile Apps 9
A Kann nicht in TextView einer anderen Klasse schreiben - wieso? Android & Cross-Platform Mobile Apps 9
M Wie in einer anderen "nicht canvas" klasse zeichne Android & Cross-Platform Mobile Apps 5

Ähnliche Java Themen

Neue Themen


Oben