Thread für HHTP-Request wird nicht aufgerufen

  • Antworten:6
  • Bentwortet
leonard
  • Forum-Beiträge: 10

06.01.2014, 14:38:38 via Website

Hallo,
ich habe eine App geschrieben, die Einstellungsmöglichkeiten für eine von mir Programmierte Kamera an einem Raspberry Pi bietet. Dazu möchte ich die Daten an ein PHP-Script auf dem Pi schicken. Der Code der Klasse, die diese Aufgabe hat, ist:
1package de.leonard.rpicontrol.kamera;
2
3import java.io.BufferedReader;
4import java.io.InputStream;
5import java.io.InputStreamReader;
6
7import org.apache.http.HttpEntity;
8import org.apache.http.HttpResponse;
9import org.apache.http.client.HttpClient;
10import org.apache.http.client.methods.HttpGet;
11import org.apache.http.impl.client.DefaultHttpClient;
12
13import android.app.Activity;
14import android.os.Bundle;
15import android.os.Handler;
16import android.util.Log;
17import android.view.View;
18import android.view.View.OnClickListener;
19import android.widget.Button;
20import android.widget.EditText;
21import android.widget.Switch;
22import android.widget.Toast;
23import de.leonard.rpicontrol.R;
24
25public class Steuern extends Activity implements OnClickListener {
26
27 private Button speichern;
28 private Handler handler;
29
30 public void onCreate(Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 setContentView(R.layout.kamerasteuern);
33
34 //Handler setzen
35 handler = new Handler();
36
37 //Momentan gesetzte Einstellungen über Server abrufen und in den Textfeldern eintragen
38
39
40 //Achtung!!! Bei der Abfrage von Dezimalzahlen darauf achten, dass Punkt anstatt Komma verwendet wird
41 //Logo selber entwerfen
42 //AlertDialog bei Verbindungsfehler anzeigen
43
44 //Buttons verarbeiten
45 speichern = (Button) findViewById(R.id.aenderungen_speichern);
46 speichern.setOnClickListener(this);
47 }
48
49 public void onClick(View v) {
50 if (v == speichern) {
51 //Alle Daten aktualisieren, aber die Einstellugnen werden noch nicht gültig, sie werden aber abgespeichert
52 //Neue Daten ermitteln
53 //Aktivitätsstatus
54 Switch aufnahme_s = (Switch) findViewById(R.id.aufnahme_aktiv);
55 final String aufnahme;
56 if (aufnahme_s.isChecked()) {
57 aufnahme = "1";
58 } else {
59 aufnahme = "0";
60 }
61 //Bilder-bis-stopp (bbs)
62 EditText bbs_et = (EditText) findViewById(R.id.bbs);
63 final String bbs = bbs_et.getText().toString();
64 //Startwert Aufnahme
65 EditText start_et = (EditText) findViewById(R.id.startwert);
66 final String start = start_et.getText().toString();
67 //Stoppwert aufnahme
68 EditText stopp_et = (EditText) findViewById(R.id.stoppwert);
69 final String stopp = stopp_et.getText().toString();
70 //Ausgabepfad
71 EditText ordner_et = (EditText) findViewById(R.id.ausgabepfad);
72 final String ordner = ordner_et.getText().toString();
73 //Nummer der Kammera (Zählung ab 0)
74 EditText kamera_et = (EditText) findViewById(R.id.kameranummer);
75 final String kamera = kamera_et.getText().toString();
76 //Abfrage
77 Log.d("super","bis zur abfrage sind wir ja immerhin schon ein mal");
78 new Thread(new Runnable() {
79 public void run() {
80 handler.post(new Runnable() {
81 public void run() {
82 Toast.makeText(Steuern.this,"thread gestartet",Toast.LENGTH_LONG).show();
83 }
84 });
85 Log.d("super","und auch der neue thread für die abfrage wird erfolgreich gestartet");
86 //Die Abfrage in einem eigenen Thread erstellen
87 //Http-Client
88 HttpClient client = new DefaultHttpClient();
89 //HTTP-Get
90 String url = "adresse";
91 HttpGet get = new HttpGet(url);
92 Log.d("super","alle daten werden auch erfolgreich erstellt, client und get exisitieren");
93 //Request
94 try {
95 //Antwort in Variable
96 HttpResponse antwort = client.execute(get);
97 //Text der Antwort lesen
98 HttpEntity entity = antwort.getEntity();
99 //Inhalt des Textes lesen
100 InputStream web = entity.getContent();
101 //Antwort konvertieren
102 Log.d("super","auch der request funktioniert problemlos");
103 try {
104 BufferedReader reader = new BufferedReader(new InputStreamReader(web,"utf-8"));
105 //Erste Zeile der Antwort ausgeben
106 String code = reader.readLine();
107 Log.d("code",code);
108 } catch (Exception e) {
109 Log.d("fehler","lesen");
110 e.printStackTrace();
111 }
112 } catch (Exception e) {
113 Log.d("fehler","abfragen");
114 e.printStackTrace();
115 }
116 }
117 });
118 }
119 }
120}
Ich habe mehrere Logeinträge eingebaut, um zu erkennen, wie weit der Code ausgeführt wird. Es wird aber nur der Logeintrag "bis zur abfrage sind wir ja immerhin schon ein mal" ausgegeben, d.h. der Thread für die Übermittlung der Daten wird nicht gesendet. Ansonsten werden keine Logeinträge wie Fehler ausgegeben, die App gibt bei Buttondruck nur den einen Logeintrag aus. Vielen Dank für Hilfe, Leonard
PS: Das adresse steht für die wirkliche Adresse, die ich aber leider nicht posten darf

Antworten
Fabian Simon
  • Forum-Beiträge: 359

06.01.2014, 14:50:42 via Website

1Log.d("super","bis zur abfrage sind wir ja immerhin schon ein mal");
2 new Thread(new Runnable() {
3 public void run() {
4 handler.post(new Runnable() {
5 public void run() {
6 Toast.makeText(Steuern.this,"thread gestartet",Toast.LENGTH_LONG).show();
7 }

Du machst einen Thread auf, der in seiner Run die run post vom handler aufruft um dann Toast,makeText zumachen....
Habs jetzt nicht getestet aber grundsätzlich sollte es funktionieren.
Jedoch was code und ausführzeit spart wäre :
1Log.d("super","bis zur abfrage sind wir ja immerhin schon ein mal");
2 Toast.makeText(Steuern.this,"thread gestartet",Toast.LENGTH_LONG).show();
Weil dein Thread ja eh nix macht !

Gruß
Fabian

Antworten
leonard
  • Forum-Beiträge: 10

06.01.2014, 14:57:12 via Website

Vielen Dank, das Problem trat aber schon auf, als ich den Toast noch nicht angezeigt hatte. Wieso macht der Thread denn nichts?

— geändert am 06.01.2014, 14:57:54

Antworten
Fabian Simon
  • Forum-Beiträge: 359

06.01.2014, 15:12:09 via Website

Tipp 1: Debuggen.
Schau nach wo er aussteigt.
Tipp 2 Logcat.
Frag die liebe Hauskatze wo der Fehler auftritt.
Tipp 3 lerne Java und Thread handling.


zu deiner Frage:
du erstellst einen neuen Thread (new Thread()) der das Interface Runnable implementiert.
In dessen Methode run du das Handler object das Interface Runnable implementierst, in dem Du einen Text ausgiebst.
Das heiß das ist das selbe wie
1Log.d("super","bis zur abfrage sind wir ja immerhin schon ein mal");
2 Toast.makeText(Steuern.this,"thread gestartet",Toast.LENGTH_LONG).show();

Nur das man das ungeschriebene Gesetzt damit nicht verletzt.
"Threadhandling wenn möglich vermeiden!"

gegen Frage was meinst du denn was der Thread macht ??

Gruß
Fabian

Antworten
Fabian Simon
  • Forum-Beiträge: 359

06.01.2014, 15:15:00 via Website

Nochwas :

Mach sowas (Zeile 50) nicht!
sondern :
1public void onClick(View v) {
2 if (v.getId ==R.id.aenderungen_speichern) {
3 //Alle Daten aktualisieren, aber die Einstellugnen werden noch nicht gültig, sie werden aber abgespeichert
4 //Neue Daten ermitteln
5 //Aktivitätsstatus
6...

Antworten
leonard
  • Forum-Beiträge: 10

06.01.2014, 15:30:32 via Website

super vielen dank das eigentliche problem war aber das ich scheinbar vergessen habe den Thread auch zu starten :D

Antworten