# Inhalt eines Eingabefeldes an einen Server senden?



## marc1887 (6. Sep 2012)

Hallo liebe Community.
Bevor ich zu meiner Frage komme wollte ich mich kurz Vorstellen bin Anwedungsentwickler in der asubildung und darf mich erst seit einer Woche mit Apps beschäftigen meine Java Kentnisse sind mau. Und ich hoffe meine Frage is nich zu dumm...


Ich möchte auf einen app ein Eingabefeld haben + einen Button
Der Inhalt des Eingabefeldes soll an einen server gesendet werden wenn man auf den Button klickt.

zb: ich wähle aus im Menü "pause" 
und geben meine Mitarbeiterid ein. Mit einen klick auf dem Button Soll nun die Id an den Server gesendet werden.
nur habe ich leider keine Ahunung wie ich das Anstelle. DAS menu bekomm ich hin. nur welchen Quellcode packe ich in die void button bei mir damit er den Inhalt an einen Server sendet?



Hoffe die Frage is nich all zu dumm  und für Rechtschreibfehler entschuldige ich mich schon jetzt einmal. 
mfg Marc


----------



## schlingel (6. Sep 2012)

> Hoffe die Frage is nich all zu dumm


Dumm nicht, aber ein wenig zu arg ohne Basics gestellt.

In dem Tutorial findest du mal die Basics damit du weißt, wie ein Button zu programmieren ist.  

Und beim Server ist die Frage was sich der überhaupt erwartet. JSON/XML für RESTful, XML für SOAP, TCP/UDP Protokol? Das weiß keiner von uns.


----------



## marc1887 (6. Sep 2012)

also unsere server laufen alle auf http. Mein Arbeitskollege Porgrammiert auch alles mit php. 
Nun ist der Wunsch von meinen Chef das ich mich mit Androidapps beschäftige und wir Daten an den Server verschicken können. Einen Button an sich zu programmieren bekomm ich hin soweit. Also einen Taschenrechner als app hab ich schon hinbekommen mit auswahlmenu. 

nur mir is schleierhaft wie ich die eigegebene ID zu dem Server hinbekomme. 
Arbeite seit letzem Freitag mit Apps habe mir tutorials angekuckt zu java eclipse und sdk und wie halt schon erwähnt ein wenig rumgespielt (taschenrechner).

hm was müsste ich denn alles hilfreiches hierrrein schreiben?


----------



## schlingel (6. Sep 2012)

Lies das Tutorial. Da wird klarerweise aus dem Text-Feld gelesen um es umzuwandeln. Und wenn du an ein PHP-Skript etwas schickst per HTTP, kannst du das mit der WebClient-Klasse machen.


----------



## marc1887 (18. Okt 2012)

Also ich hab das jetzt soweit hinbekommen über den emulator kann ich eine eingabe in mein Textfeld machen und per Buttonklick werden sie Versendet und ich kann sie unter 
mir auch auf einer adresseansehen. Soweit sogut funktioniert auch alles.

Aber wenn ich die app auf meinem Galaxy s3 testen möchte stürzt sie sobald ich den button klicke ab. zuerst stoppt es und dann schließt sich die app. Übern Simulator läuft aber alles ohne probleme. 

in der Manifest habe ich die minSdkVersion= 10 und die targetSdkVersion=16

Woran kann das liegen? 

bei mir werden keine fehler angezeigt. hier einmal mein code

[JAVA=42]
 public void ButtonClick (View view){    
    		        String c;

    		        EditText Feld1 = (EditText)findViewById(R.id.zahl1);
    		       c = Feld1.getText().toString();
    		        postRequest(c);
    		            }





    		    public void postRequest(String c){
    		        HttpClient client = new DefaultHttpClient();
    		        HttpPost httppost = new HttpPost("http://meineseite.php");
    		        try {
    		            // Add your data


    		            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);

    		            nameValuePairs.add(new BasicNameValuePair("var", c));

    		            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    		            client.execute(httppost);

    	        } catch (ClientProtocolException e) {
    		            // TODO Auto-generated catch block
    		        } catch (IOException e) {
    		            // TODO Auto-generated catch block
    		        	EditText Feldx = (EditText)findViewById(R.id.zahl2);
    		        	Feldx.setText(String.valueOf(e));
    		        }
    		    } ; }
[/code]

mfg marc


----------



## schlingel (18. Okt 2012)

Wundert mich zwar, dass es im Emulator läuft aber so wie der Code aussieht, fliegt eine NetworkOnMainThreadException. (Hättest du auch selber gesehen, wenn du den Logcat bemüht hättest.)

Du musst den Netzwerk-Code weg vom UI-Thread bringen. (AsyncTask, IntentService, etc.)


----------



## schlingel (20. Okt 2012)

Zur Klarstellung: Das Problem ist, dass du Code im falschen Thread ausführen willst. Das wurde ab HONEYCOMB verboten. Seit dem, schmeißt das System diese Exceptions, wenn eine Operation potentiell lange dauern kann. Bei Netzwerkverbindungen passiert das, bei GSON parsing ist mir das auch schon untergekommen.

Was musst du also machen? Du musst den Code in einen Thread packen. Dazu kannst du entweder einen normalen JAVA-Thread verwenden, einen AsyncTask oder einen IntentService.


----------



## schlingel (22. Okt 2012)

AsyncTask<T1, T2, T3> hat drei Typparameter.

T1 ist der Eingabetyp => in deinem Fall String
T2 ist der Progress-Update-Typ => In deinem Fall Void. Denn entweder du hast die Antwort vom Server oder nicht.
T3 ist der Rückgabe-Wert der asynchronen Methode => In deinem Fall bietet sich ein Boolean an. (Success)

Du musst deine AsyncTask-Klasse also so designen, dass sie die Parameter nimmt, den Server asynchron anruft und dann das Ergebnis an dein Programm zurück gibt.


```
private class MyTask extends AsyncTask<String, Void, Boolean> {
	private Throwable occurredProblem;
	
        public Throwable getProblem() {
          get occurredProblem;
        }

	@Override
	protected Boolean doInBackground(String... params) {
	  if(params == null || params.length == 0) {
		occurredProblem = new IllegalArgumentException("MyTask needs a valid String param!");
		return false;
	  } else {
		return postRequest(params[0]);
	  }
	}

	public boolean postRequest(String c){
		occurredProblem = null;
		HttpClient client = new DefaultHttpClient();
		HttpPost httppost = new HttpPost("http://macscripts.hplarray.de/apps/android/index.php");
		try {
			
			 
			ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
			nameValuePairs.add(new BasicNameValuePair("var", c));
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

			client.execute(httppost);
			
		} catch (ClientProtocolException e) {
				occurredProblem = e;
		} catch (IOException e) {
			occurredProblem = e;
		}
   
		return occurredProblem != null; }}
	}        
}
```

Diese Klasse kannst du dann in deinem Code so verwenden:


```
MyTask task = new MyAsyncTask<String, Void, Boolean>() {
  @Override 
  protected void onPostExecute(Boolean... params) {
    String msg = "";
    if(params == null || params.length == 0) {
      msg = "Generic error!";
    } else if(!params[0]) {
       msg = this.getOccurredProblem() != null ? this.getOccurredProblem().getErrorMessage() : "Something bad happened!";
    } else {
       msg = "Success";
    }
  
    Feldx.setText(msg);
  }
}; // hier erzeugen wir eine anonyme Klasse vom Typ MyTask, die, die onPostExecute implementiert.

task.execute(c);
```

Ich hab das alles im Edit-Feld runter getippt. Könnte also sein dass da Syntax-Fehler drinnen sind. Bitte die selber fixen. Aber ich hoffe das Prinzip ist jetzt etwas klarer.


----------



## marc1887 (23. Okt 2012)

Okay also es klappt bei mir aufm handy jetzt allerdings freezt es wieder ein sobald ich erneut ein 2tes paar daten senden will. 
muss ich die die netzwerkklasse die ich mit asyntask versehen habe nun in eine endlosschleife einbinden ?


----------



## schlingel (24. Okt 2012)

Einen AsyncTask kann man nur einmal verwenden. Du musst eine neue Instanz davon holen.

Aber bitte lerne endlich selbstständig den Logcat zu verwenden. Dann gibst du bei Google einfach nur den Exception-Namen ein und die Chancen stehen nicht schlecht, dass dir sofort geholfen wird.


----------

