Hallo nochmal,
so ich habe wieder mal ein wenig gebastelt, und so langsam - Stück für Stück verstehe ich ein paar von den Dingen, die da so stehen.
Ich habe mithilfe der geposteten Links ein wenig was basteln können, konnte es sogar zum Großteil nachvollziehen, was für mich als Programmier-Neuling nich ganz einfach war. Habe den Code noch ein wenig angepasst und die einzelnen Abschnitte in mehrere Klasse aufgeteilt und stehe nun vor neuen Problemen:
Hier mal das, was ich bisher so gemacht habe:
Wollte übrigens das ganze in die vorgeshenen Code-Boxen schreiben, aber da wird mein Quellcode jedesmal unlesbar verschoeben, daher jetzt leider nur so.
- Meine Activity Class erzeugt beim Aufrufen ein Objekt um die HTTP Anfrage zu erstellen in einer seperaten Klasse und ruft zugehörige Methode auf
--------------------------------------------------------------------------------------------------------------------------------------------------
public class ActivityData extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_data);
ConnectionHttp ConnectionHttp_Instanz = new ConnectionHttp (this);
ConnectionHttp_Instanz.getData();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_activity_data, menu);
return true;
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------
Diese Klasse realisiert die Verbindung, habe ich so von dem Tutorial übernommen und ein wenig angepasst. Wichtig ist ja hier der Aufruf für den Hintergrundprozess durch Erzeugung eines "ReadData" objektes.
-------------------------------------------------------------------------------------------------------------------------------------------------
public class ConnectionHttp {
private final String TAG = ActivityLogin.class.getSimpleName();
private final String url = "http://192.168.1.107/test1.php";
// Konstruktor
public ConnectionHttp(Activity activityData)
{
activity = activityData;
}
// Activity Member fuer aktuelle GUI -> AcitivityData -> notwendig fuer Meldungen auf GUI
private Activity activity;
// HTTP
public void getData()
{
//der HttpClient dient dazu die Anfrage an den Server zu stellen
HttpClient client = new DefaultHttpClient();
//Art der Anfrage
HttpGet httpGet = new HttpGet(url);
//Antwort des Severs
HttpResponse response = null;
try {
//ausführen der Anfrage
response = client.execute(httpGet);
} catch (ClientProtocolException e) {
Log.e(TAG,"Falsches Protokol " + " " + e.getMessage());
} catch (IOException e) {
Log.e(TAG,"URL ist falsch, URL:"+ url + " " + e.getMessage());
}
//Kontrolle ob bei ausführen der Anfrage ein Fehler aufgetreten ist
if(response != null){
//Status der Abfrage
StatusLine statusLine = response.getStatusLine();
//Statuscode 200 => Die Anfrage wurde erfolgreich bearbeitet und das Ergebnis der Anfrage wird in der Antwort übertragen
if(statusLine.getStatusCode() == 200) {
//Ergebnis der Anfrage
HttpEntity entity = response.getEntity();
try {
//Start des Hintergrundprozess um zu parsen -> neue ReadData Instanz erzeugen
// Übergabe der derzeitigen GUI als activity
new ReadData(activity).execute(entity.getContent());
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
else{
Toast.makeText(activity,"Der Server antwortet mit anderen Statuscode als 200. Statuscode: "+statusLine.getStatusCode(), Toast.LENGTH_SHORT).show();
}
}
else{
Toast.makeText(activity,"Keine Internetverbindung.", Toast.LENGTH_SHORT).show();
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------
Jetzt kommt ja die eigentliche Verarbeitung des InputStreams, insofern ich das Richtig verstanden habe.
-------------------------------------------------------------------------------------------------------------------------------------------------
public class ReadData extends AsyncTask<InputStream, Void, Void> {
// Anzeige das vom Server geladen wird
private ProgressDialog dialog;
private String TestString;
private Activity activity1;
// Konstruktor
public ReadData(Activity activity)
{
dialog = new ProgressDialog(activity);
activity1 = activity;
}
// wird VOR onInBackground ausgeführt
protected void onPreExecute()
{
// einrichten des Wartedialogs
this.dialog.setTitle("Bitte warten!");
this.dialog.setMessage("Daten werden geladen");
this.dialog.show();
}
// Aktion im Hintergrund
protected Void doInBackground(InputStream... inputStreams)
{
// Hier Aktion fuer Hintergrund
return null;
}
// Aktion NACH Ausführung
protected void onPostExecute(Void result)
{
// Dialog beenden
if (dialog.isShowing()) {
dialog.dismiss();
}
// Write to Text
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------
Das ist erstmal was ich bisher so habe, sicher ist das weit ab von gutem Programmierstil und kann sicher tausend mal besser gemacht werden, aber ich bin froh, erstmal soweit gekommen zu sein - in der Hoffnung das es irgendwann mal funktioniert.
Mein Problem ist jetzt, ich wollte erstmal versuchen, einen einfachen String von einem php Dokument zu laden und mir anzeigen zu lassen, um einfach mal überprüfen zu lassen, ob die Verbindung überhaupt klappt - leider komme ich da nicht ganz weiter.
Meine Idee war jetzt, das ich den Inputstream in einen String wandeln muss um diesen dann z.B. auf einem TextView auszugeben, ist das Richtig?
Ich habe da auch schonmal ein wenig rumprobiert und ein paar Sachen zu im Internet gefunden, leider bin ich daran gescheitert, wie ich diesen String, der dann entsteht, auf ein TextView in der Acitivty schreibe?
Ich wollte eigentlich eine Methode in der Activity erzeugen und dieser den String übergeben, leider weiss ich aber nicht, wie die Instanz der Activity heißt um diese Methode anzusprechen, daher habe ich versucht die Activity im Konstruktor immer zu übergeben, um von der Klasse "ReadData" aus, das TextView anzusprechen, das funktionierte aber auch nicht.
Wäre daher schön zu wissen, wie das jetzt genau Funktioniert, von einer Klasse außerhalb der Activity die TextView anzusprechen?
Wenn das schonmal funktionieren würde, wäre ich schon sehr froh um mich dann um das weitere zu kümmern, wie den Parser etc. - aber eins nach dem anderen, möchte ja auch lernen was ich hier tue.
Eine paar weitere Fragen noch:
- protected Void doInBackground(InputStream... inputStreams)
Ich verstehe noch nicht ganz, wie InputStream funktioniert - bzw, wie die Daten dort gespeichert sind. Welche Länge haben die Datenfelder bzw. wie ist es gespeichert?
Wie sieht eine sinnvolle weiterverarbeitung aus?
- AsyncTask<InputStream, Void, Void>
Ich verstehe leider nicht und habe dazu auch nich gefunden, was die Parameter hinter dem Klassennamen bedeuten? Ich habe so eine Syntax leider noch nie gesehen.
Tut mir leid, für die sicher vielen Anfänglichen-Fragen, aber so heißt das Forum ja auch. Danke falls sich jemand die Zeit nehmen würde, einem Anfänger das ganze ein wenig näher zu erklären.
Beste Grüße