sql >> Database >  >> RDS >> Mysql

Android - JSON mySQL-query geeft NetworkOnMainThreadException

Ik heb gehoord dat het vanaf ICS niet is toegestaan ​​om netwerkbewerkingen uit te voeren op de UI (hoofd)thread. Daarom moet u deze bewerking in een aparte thread uitvoeren. Gebruik dus ofwel AsyncTask , Draad of HandlerThread met Looper en Handler webbewerking uit te voeren. Als je het probeert op een apparaat met froyo of peperkoek, zou het goed zijn, maar niet op ICS.

Wat betreft uw poging om het via handler of AsyncTask uit te voeren, hangt het ervan af hoe u het hebt gedaan. Plak die code zodat ik het probleem zie.

Bijwerken

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

}

*Er waren enkele problemen met het aanroepen van methoden en de belangrijkste was dat u sleutels uit JSONObject ophaalde als Idfriend, Id1, Id2 wat niet klopt, want in je json-string zijn de sleutels als idfriend, id1, id2 . Het is hoofdlettergevoelig, daarom crashte het.



  1. MySQL verbinden met Visual Studio C#

  2. Ik kan de invoer van dubbele namen niet voorkomen

  3. MySQL - lengte() versus char_length()

  4. Ontbrekende maanden opnemen in Groeperen op zoekopdracht