Netzwerkverbindung

e9926044

Bekanntes Mitglied
Hallo,

wenn ich mich mit dem Mobile zu einem Server verbinde - etwas senden und empfangen möchte, mache ich das mit folgendem Thread

Java:
public class MyActivity extends Activity {
...
new Thread() {
			public void run() {
				try {
					final HttpResponse response = client.execute(httpPost);
					final HttpEntity entity = response.getEntity();
					NetworkConnectionToServer.this.is = entity.getContent();
					final InputStreamReader isr = new InputStreamReader(is);
					final BufferedReader br = new BufferedReader(isr);
					String s = ""; 
					while((s = br.readLine()) != null) {
						startActivity.setReceivedFromServer(s);
						}
					} 
				catch (final ClientProtocolException e) {
					e.printStackTrace();
					} 
				catch (final IOException e) {
					e.printStackTrace();
					}
				}
			}.start();

Das Problem ist jetzt mit dem empfangene String (s), dass ich diesen auf der Activity/View in einer TextView anzeigen möchte, das geht aber nicht, da man nicht von einem anderen Thread (in meinem Fall new Thread() ...) auf den Thread mit der Activity zugreifen kann.
Weiß da jemand rat, wie ich das machen könnte, einen eigenen Thread zum Senden des Strings an den Server brauch ich ja, weil sonst der Send- Button blockiert!?
 

mjdv

Bekanntes Mitglied
Jop da weiß ich was, da nimmt man zB. einen Handler

Das könnte dann so aussehen:

Java:
private class myHandler extends Handler {
                @Override
                public void handleMessage (Message msg) {
                        view.setText(responseStr);
                }
        }

Dann musste nur handler.sendEmptyMessage(MAX_PRIORITY); machen, kannst natrülich auch den response String als message senden denk ich.
 

Generic1

Top Contributor
Ich verschicke ja momentan meine Daten mittels:

final HttpResponse response = client.execute(httpPost);

Meine Frage wäre jetzt noch, wo häng ich den Handler dran?
Vielen Dank,
lg
 

mjdv

Bekanntes Mitglied
Verstehe ich jetzt nicht ganz so ^^

Du machst ein Objekt von myHandler und sendest dann immer eine Message wenn du Daten hast die in der Activity angezeigt werden sollen.
 

Generic1

Top Contributor
Verstehe ich jetzt nicht ganz so ^^

Du machst ein Objekt von myHandler und sendest dann immer eine Message wenn du Daten hast die in der Activity angezeigt werden sollen.

Das versteh ich jetzt nicht ganz,
Ich mache also ein Object:

MyHandler myHandler = new MyHandler()

und diese Instanz "myHandler" muss ich ha dann irgendwo anmelden, damit dann die Methode

ic void handleMessage (Message msg)

aufgerufen wird, oder seh ich da was falsch?
lg
 

mjdv

Bekanntes Mitglied
Naja wie gesagt du sendest eine Message damit.

Deine Thread Funktion:
Java:
public void run() {
String data = getDataZ();
Bundle b = new Bundle();
b.putString("data", data);
Message m = new Message();
m.setData(b)
myHandlerObj.sendMessage(m);
}

Die Handler Klasse:
Java:
private class myHandler extends Handler {
                @Override
                public void handleMessage (Message msg) {
                        view.setText(msg.getData().getString("data"));
                }
        }
}

myHandlerObj muss in dem Thread erstellt werden in dem auch die view erstellt wurde.

Hoffe das ist dir jetzt ein wenig klarer.

PS: Du kannst auch sendEmptyMessage nutzen und den data String irgendwo in die Klasse setzen wo eben der Thread und die Handler Klasse drauf zu greifen kann. Ist vll. resourcenschonender, da keine Message und Bundle Objekte gemacht werden müssen.
 
Zuletzt bearbeitet:

mjdv

Bekanntes Mitglied
Hi Leute,

muss den Thread jetzt nochmal ausgraben :D

Es gibt eine viel einfachere Möglichkeit, die UI zu aktualisieren:

Activity | Android Developers

Java:
this.runOnUiThread(new Runnable() {
            public void run() {
                view.setText(getData());
            }
        });

Hab ich vorher auch nicht gekannt sorry ;)
 

Neue Themen


Oben