sql >> Databasteknik >  >> RDS >> Mysql

Android - JSON mySQL-fråga ger NetworkOnMainThreadException

Jag hörde att från och med ICS är det inte tillåtet att utföra nätverksoperationer på UI (huvud) tråd. Därför måste du utföra denna operation i en separat tråd. Så använd antingen AsyncTask , Tråd eller HandlerThread med Looper och Handler för att utföra webboperation. Om du provar det på en enhet som kör froyo eller pepparkakor, skulle det vara bra men inte på ICS.

Angående ditt försök att köra det via hanterare eller AsyncTask, det beror på hur du gjorde det. Klistra in den koden så att jag ser problemet.

Uppdatera

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();
        }
    }

}

*Det fanns problem med metodanrop och det viktigaste var att du hämtade nycklar från JSONObject som Idfriend, Id1, Id2 vilket är fel eftersom nycklarna i din json-sträng är som idfriend, id1, id2 . Dess skiftlägeskänsliga, det var därför den kraschade.



  1. Att få en dynamiskt genererad pivottabell till en Temp-tabell

  2. skicka användaren ett meddelande genom att skicka deras id till en modal box

  3. Pythons MySQLdb kan inte hitta libmysqlclient.dylib med hembryggt MySQL

  4. Beräkna arbetstid mellan 2 datum i PostgreSQL