Android java onclick listener Problem

  • Java

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von schnibli.

    Android java onclick listener Problem

    Hallo zusammen,

    Ich habe im Android Studio folgenden Code:

    Java-Quellcode

    1. package bmu_access.com.bmuapp;
    2. import android.os.Bundle;
    3. import android.support.annotation.Nullable;
    4. import android.support.v4.app.Fragment;
    5. import android.util.Log;
    6. import android.view.LayoutInflater;
    7. import android.view.View;
    8. import android.view.ViewGroup;
    9. import android.widget.Button;
    10. import android.widget.EditText;
    11. import android.widget.Toast;
    12. import org.apache.http.HttpEntity;
    13. import org.apache.http.HttpResponse;
    14. import org.apache.http.StatusLine;
    15. import org.apache.http.client.ClientProtocolException;
    16. import org.apache.http.client.HttpClient;
    17. import org.apache.http.client.entity.UrlEncodedFormEntity;
    18. import org.apache.http.client.methods.HttpPost;
    19. import org.apache.http.impl.client.DefaultHttpClient;
    20. import org.apache.http.message.BasicNameValuePair;
    21. import java.io.BufferedReader;
    22. import java.io.IOException;
    23. import java.io.InputStream;
    24. import java.io.InputStreamReader;
    25. import java.util.ArrayList;
    26. import java.util.List;
    27. /**
    28. * Created by Roger on 11.03.2015.
    29. */
    30. public class menu8_Fragment extends Fragment {
    31. View rootview;
    32. @Nullable
    33. @Override
    34. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    35. rootview = inflater.inflate(R.layout.menu8_layout, container, false);
    36. final EditText txt_monteur = (EditText)rootview.findViewById(R.id.txt_id_monteur_nr);
    37. final EditText txt_von = (EditText)rootview.findViewById(R.id.txt_von);
    38. final EditText txt_bis = (EditText)rootview.findViewById(R.id.txt_bis);
    39. final EditText txt_pause = (EditText)rootview.findViewById(R.id.txt_pause);
    40. final EditText txt_projekt = (EditText)rootview.findViewById(R.id.txt_projekt);
    41. final Button btn_speichern = (Button) rootview.findViewById(R.id.btn_speichern);
    42. System.out.println("working");
    43. btn_speichern.setOnClickListener(new View.OnClickListener() {
    44. @Override
    45. public void onClick(View v) {
    46. System.out.println("working2");
    47. String url = "http://url/einfügen.php";
    48. List params = new ArrayList();
    49. System.out.println("working3");
    50. params.add(new BasicNameValuePair("id_monteur", txt_monteur.getText().toString()));
    51. params.add(new BasicNameValuePair("datum", txt_von.getText().toString()));
    52. params.add(new BasicNameValuePair("arbeitsbeginn", txt_bis.getText().toString()));
    53. System.out.println("working4");
    54. @SuppressWarnings("unused")
    55. String resultServer = getHttpPost(url,params);
    56. Toast.makeText(getActivity(), "1 Record inserted...", Toast.LENGTH_LONG).show();
    57. System.out.println("working5");
    58. }
    59. });
    60. return rootview;
    61. }
    62. public String getHttpPost(String url,List params) {
    63. StringBuilder str = new StringBuilder();
    64. HttpClient client = new DefaultHttpClient();
    65. HttpPost httpPost = new HttpPost(url);
    66. try {
    67. httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    68. HttpResponse response = client.execute(httpPost);
    69. StatusLine statusLine = response.getStatusLine();
    70. int statusCode = statusLine.getStatusCode();
    71. if (statusCode == 200) { // Status OK
    72. HttpEntity entity = response.getEntity();
    73. InputStream content = entity.getContent();
    74. BufferedReader reader = new BufferedReader(new InputStreamReader(content));
    75. String line;
    76. while ((line = reader.readLine()) != null) {
    77. str.append(line);
    78. }
    79. } else {
    80. Log.e("Log", "Failed to download result..");
    81. }
    82. } catch (ClientProtocolException e) {
    83. e.printStackTrace();
    84. } catch (IOException e) {
    85. e.printStackTrace();
    86. }
    87. return str.toString();
    88. }
    89. }

    Leider erscheint folgender Fehler nach Drücken des Buttons:

    Quellcode

    1. 05-12 16:58:01.356 28512-28512/biu_lappses.com.biu_lappses I/System.out﹕ working4
    2. 05-12 16:58:01.536 28512-28512/biu_lappses.com.biu_lappses I/System.out﹕ Thread-1(ApacheHTTPLog):Reading from variable values from setDefaultValuesToVariables
    3. 05-12 16:58:01.561 28512-28512/biu_lappses.com.biu_lappses I/System.out﹕ Thread-1(ApacheHTTPLog):isShipBuild true
    4. 05-12 16:58:01.561 28512-28512/biu_lappses.com.biu_lappses I/System.out﹕ Thread-1(ApacheHTTPLog):SmartBonding Enabling is false, SHIP_BUILD is true, log to file is false, DBG is false
    5. 05-12 16:58:01.586 28512-28512/biu_lappses.com.biu_lappses D/dalvikvm﹕ GC_FOR_ALLOC freed 2385K, 23% free 10300K/13340K, paused 20ms, total 20ms
    6. 05-12 16:58:01.591 28512-28512/biu_lappses.com.biu_lappses I/System.out﹕ main calls detatch()
    7. 05-12 16:58:01.591 28512-28512/biu_lappses.com.biu_lappses D/AndroidRuntime﹕ Shutting down VM
    8. 05-12 16:58:01.591 28512-28512/biu_lappses.com.biu_lappses W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4180ac08)
    9. 05-12 16:58:01.596 28512-28512/biu_lappses.com.biu_lappses E/AndroidRuntime﹕ FATAL EXCEPTION: main
    10. Process: biu_lappses.com.biu_lappses, PID: 28512
    11. android.os.NetworkOnMainThreadException
    12. at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166)
    13. at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    14. at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    15. at java.net.InetAddress.getAllByName(InetAddress.java:214)
    16. at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    17. at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167)
    18. at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:125)
    19. at org.apache.http.impl.client.DefaultRequestDirector.executeOriginal(DefaultRequestDirector.java:1227)
    20. at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:677)
    21. at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:570)
    22. at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:491)
    23. at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:469)
    24. at biu_lappses.com.bmuapp.menu8_Fragment.getHttpPost(menu8_Fragment.java:76)
    25. at biu_lappses.com.bmuapp.menu8_Fragment$1.onClick(menu8_Fragment.java:60)
    26. at android.view.View.performClick(View.java:4658)
    27. at android.view.View$PerformClick.run(View.java:19461)
    28. at android.os.Handler.handleCallback(Handler.java:733)
    29. at android.os.Handler.dispatchMessage(Handler.java:95)
    30. at android.os.Looper.loop(Looper.java:146)
    31. at android.app.ActivityThread.main(ActivityThread.java:5694)
    32. at java.lang.reflect.Method.invokeNative(Native Method)
    33. at java.lang.reflect.Method.invoke(Method.java:515)
    34. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
    35. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
    36. at dalvik.system.NativeStart.main(Native Method)

    Kann mir jemand Helfen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „schnibli“ ()

    Bin kein Profi in Android programmierung aber les dir mal Zeile 12- 36 durch, gibt dir Hinweise bzw. Infos wo der Fehler ungefähr liegt (denk ich mal) oder Google die einzelnen Fehler mal, hab ich früher bei Java auch ab und zu getan!
    There are only 10 types of people in the world: Those who understand binary and those who don't.
    Eigentlich sagt die Exception doch schon was los ist nämlich NetworkOnMainThread. Android mag es gar nicht gerne, wenn man aus dem Main Thread, sprich dem in dem auch dein Button klicken behandelt wird, irgendwas gemacht wird, dass mit dem Netzwerk zu tun hat. Bei dir der HTTP Request. Die Lösung besteht darin, die Netzwerk Operation in einen eigenen Thread auszulagern. Siehe developer.android.com/reference/android/os/AsyncTask.html

    Gruß
    Es gibt aber keine andere Möglichkeit. Android erlaubt halt einfach keine Netzwerk Operationen im Main Thread, vor allem aus Gründen der besseren Bedienbarkeit. Hast du es mal mit einer anonymen AsyncTask Klasse versucht? Das geht eigentlich ohne irgendwelche Probleme..

    Gruß
    Hallo, die Antwort hätte nicht für dich "Zakath" sein sollen.
    Edit:

    Quellcode

    1. ​ btn_speichern.setOnClickListener(new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. System.out.println("working2");
    5. String url = "http://test.php";
    6. List params = new ArrayList();
    7. System.out.println("working3");
    8. params.add(new BasicNameValuePair("id_monteur", txt_monteur.getText().toString()));
    9. params.add(new BasicNameValuePair("datum", txt_von.getText().toString()));
    10. params.add(new BasicNameValuePair("arbeitsbeginn", txt_bis.getText().toString()));
    11. System.out.println("working4");
    12. new WEBSERVICEREQUESTOR().execute(url, params);
    13. Toast.makeText(stunden_eintragen.this, "1 Record inserted...", Toast.LENGTH_LONG).show();
    14. System.out.println("working5");
    15. }
    16. });
    17. }
    18. class WEBSERVICEREQUESTOR extends AsyncTask<String, Integer, String> {
    19. private String getHttpPost(String url, List params) {
    20. StringBuilder str = new StringBuilder();
    21. HttpClient client = new DefaultHttpClient();
    22. HttpPost httpPost = new HttpPost(url);
    23. try {
    24. httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    25. HttpResponse response = client.execute(httpPost);
    26. StatusLine statusLine = response.getStatusLine();
    27. int statusCode = statusLine.getStatusCode();
    28. if (statusCode == 200) { // Status OK
    29. HttpEntity entity = response.getEntity();
    30. InputStream content = entity.getContent();
    31. BufferedReader reader = new BufferedReader(new InputStreamReader(content));
    32. String line;
    33. while ((line = reader.readLine()) != null) {
    34. str.append(line);
    35. }
    36. } else {
    37. Log.e("Log", "Failed to download result..");
    38. }
    39. } catch (ClientProtocolException e) {
    40. e.printStackTrace();
    41. } catch (IOException e) {
    42. e.printStackTrace();
    43. }
    44. return str.toString();
    45. }
    46. @Override
    47. protected String doInBackground(String... params) {
    48. return null;
    49. }
    50. }
    51. }

    So irgendwie sollte es ja stimmen :s .....
    Jeodch krieg ich hier:
    new WEBSERVICEREQUESTOR().execute(url, params); --> Can not reslove....... :s

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „schnibli“ ()

    Du musst deinen Code etwas anpassen, damit er mit AsyncTask zurecht kommt. Der Grundaufbau eines AsyncTasks ist inetwa so :

    Java-Quellcode

    1. public class MyAsyncTask extends AsyncTask<String, Void, String>
    2. {
    3. protected void doInBackground(String... input)
    4. {
    5. //Hier die Operation durchführen, also dein Code
    6. }
    7. protected void onPostExecute(string s)
    8. {
    9. //Hier jetzt das Ergebnis verarbeiten. Diese Methode wird im GUI Thread aufgerufen
    10. }
    11. }

    Du musst die Anfrage in der Methode doInBackground durchführen. Also nur die zwei Methoden. Ich hab leider grade keinen Rechner zur Hand tut mir leid.

    Wenn du zwei Sachen übergeben möchtest musst du wohl oder übel eine eigne Klasse anlegen, also

    Java-Quellcode

    1. public class MyData
    2. {
    3. public String url;
    4. public List params;
    5. }


    Gruß
    Leider krieg ich es nicht gebacken:

    Brainfuck-Quellcode

    1. List params = new ArrayList();
    2. System.out.println("working3");
    3. params.add(new BasicNameValuePair("id_monteur", txt_monteur.getText().toString()));
    4. params.add(new BasicNameValuePair("datum", txt_von.getText().toString()));
    5. params.add(new BasicNameValuePair("arbeitsbeginn", txt_bis.getText().toString()));
    6. System.out.println("working4");
    7. Toast.makeText(stunden_eintragen.this, "1 Record inserted...", Toast.LENGTH_LONG).show();
    8. System.out.println("working5");
    9. }
    10. });
    11. }
    12. public class MyData
    13. {
    14. public String url;
    15. public List params;
    16. }
    17. ClientAsyncTask clientAST = new ClientAsyncTask();
    18. class ClientAsyncTask extends AsyncTask<String, Void, String> {
    19. @Override
    20. protected String doInBackground(String... params) {
    21. String url = "info.php";
    22. String result = null;
    23. StringBuilder str = new StringBuilder();
    24. HttpClient client = new DefaultHttpClient();
    25. HttpPost httpPost = new HttpPost(url); --------> url = can not reslove symbol url
    26. System.out.println("working6");
    27. try {
    28. httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    29. HttpResponse response = client.execute(httpPost);
    30. StatusLine statusLine = response.getStatusLine();
    31. int statusCode = statusLine.getStatusCode();
    32. if (statusCode == 200) { // Status OK
    33. HttpEntity entity = response.getEntity();
    34. InputStream content = entity.getContent();
    35. BufferedReader reader = new BufferedReader(new InputStreamReader(content));
    36. String line;
    37. while ((line = reader.readLine()) != null) {
    38. str.append(line);
    39. }
    40. } else {
    41. Log.e("Log", "Failed to download result..");
    42. System.out.println("working7");
    43. }
    44. } catch (ClientProtocolException e) {
    45. e.printStackTrace();
    46. } catch (IOException e) {
    47. e.printStackTrace();
    48. }
    49. return result;
    50. }
    51. @Override
    52. protected void onPostExecute(String s) {
    53. }
    54. }
    55. }


    Und wie muss ich den die klassen genau aufrufen?

    Sorry hab noch nie so mit klassen gearbeitet:s

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „schnibli“ ()