Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Android - JSON mySQL-Abfrage gibt NetworkOnMainThreadException

Ich habe gehört, dass es ab ICS nicht erlaubt ist, Netzwerkoperationen im UI-Thread (Hauptthread) durchzuführen. Daher müssen Sie diesen Vorgang in einem separaten Thread ausführen. Verwenden Sie also entweder AsyncTask , Thread oder HandlerThread mit Looper und Handler um Web-Operationen durchzuführen. Wenn Sie es auf einem Gerät versuchen, auf dem Froyo oder Gingerbread läuft, wäre es in Ordnung, aber nicht auf ICS.

In Bezug auf Ihren Versuch, es über Handler oder AsyncTask auszuführen, hängt es davon ab, wie Sie es getan haben. Fügen Sie diesen Code ein, damit ich das Problem sehe.

Aktualisieren

public class MySQLAndroidActivity extends ListActivity {

    private static final String url = "http://X.X.X.X/test.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity2);

        LoadTask t = new LoadTask();
        t.execute(null);

    }

    private static class LoadTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {

        }

        @Override
        protected Void doInBackground(Void... params) {
            doStuff();

            return null;
        }
    }





    public static void doStuff() {
        JSONArray jArray;
        String result = null;
        InputStream is = null;
        StringBuilder sb = null;
        HttpResponse response;
        HttpEntity entity;

        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        // http post
        try {
            HttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost(url);

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            response = httpclient.execute(httppost);

            entity = response.getEntity();

            is = entity.getContent();

        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection" + e.toString());
            System.exit(1);
        }

        // convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            sb = new StringBuilder();
            sb.append(reader.readLine() + "\n");

            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            is.close();
            result = sb.toString();

            Log.i("json string", result);
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }


        // parsing data
        String idfriend;
        String id1;
        String id2;
        try {
            jArray = new JSONArray(result);
            JSONObject json_data = null;

            System.out.println("Length " + jArray.length());
            Log.d("DB", "Length " + jArray.length());

            for (int i = 0; i < jArray.length(); i++) {

                System.out.println("counter " + i);
                json_data = jArray.getJSONObject(i);
                idfriend = json_data.getString("idfriend");
                id1 = json_data.getString("id1");
                id2 = json_data.getString("id2");

                System.out.println("id1: " + id1);
            }
        } catch (JSONException e1) {
            Log.d("DB", "Error somewhere");
        } catch (ParseException e1) {
            e1.printStackTrace();
        }
    }

}

* Es gab einige Probleme beim Aufrufen von Methoden, und das Wichtigste war, dass Sie Schlüssel aus JSONObject als Idfriend, Id1, Id2 abgerufen haben Das ist falsch, weil die Schlüssel in Ihrem JSON-String wie idfriend, id1, id2 lauten . Es wird zwischen Groß- und Kleinschreibung unterschieden, deshalb stürzte es ab.