Android - JSON-MySQL-Abfrage gibt NetworkOnMainThreadException

Ich versuche, diese Aktivität auszuführen, um eine Datenbank zum Auffüllen einer Tabelle abzufragen. Ich habe versucht, einem Snippet zu folgen, das ich online gefunden habe. Das einzige Problem ist, egal was passiert, dass der Fehler "connectionandroid.os.NetworkOnMainThreadException" angezeigt wird.

Ich habe versucht, einen Handler, wie in vielen Foren vorgeschlagen, mit AsyncTask einzurichten und im Hintergrund auszuführen, aber immer noch nichts. Ich weiß, dass der Fehler auftritt, wenn eine lange Abfrage an eine Datenbank gesendet wird, diese Abfrage jedoch wahrscheinlich 0,1 s dauert. Ich habe die db lokal, obwohl mit öffentlichen IP zugreifen, und die db ist extrem klein.

Hier mein PHP Code:

<code><?php

$hostname_localhost ="localhost";
$database_localhost ="DB";
$username_localhost ="root";
$password_localhost ="pwd";

mysql_connect($hostname_localhost,$username_localhost,$password_localhost);

mysql_select_db($database_localhost);

$sql=mysql_query("select * from friendlist where Id1 = 1");
while($row=mysql_fetch_assoc($sql))
$output[]=$row;
print(json_encode($output));
mysql_close();
?>
</code>

Der Code funktioniert so, als ob ich auf die Seite gehe, auf der die Ergebnisse angezeigt werden (momentan habe ich nur 3 Zeilen).

Hier ist der Java-Teil:

<code>import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.net.ParseException;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class MySQLAndroidActivity extends ListActivity {

JSONArray jArray;
String result = null;
InputStream is = null;
StringBuilder sb=null;
HttpResponse response;
HttpEntity entity;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

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

 HttpPost httppost = new HttpPost("http://X.X.X.X/test.php");

 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="0";
   while ((line = reader.readLine()) != null) {
                  sb.append(line + "\n");
    }
    is.close();
    result=sb.toString();
    }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;
  for(int i=0;i<jArray.length();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){
   Toast.makeText(getBaseContext(), "No Id found" ,Toast.LENGTH_LONG).show();
  } catch (ParseException e1) {
   e1.printStackTrace();
 }
}
}
</code>

Ich habe auch versucht, eine einfache Aktivität und keine ListActivity zu verwenden.

Ich habe einen fast ähnlichen Code, aber dieser verwendet eine andere Methode. Tatsächlich wird das Ergebnis nicht angezeigt. Auf PHP werden nur Zeichen zurückgegeben, unabhängig davon, ob 0 oder mehr Zeilen abgerufen wurden. In diesem Fall benötige ich etwas auf einer höheren Ebene, da ich die Werte einiger bestimmter Felder abrufen muss.

BEARBEITEN:

Wie gewünscht, der Stacktrace:

<code>  Error in http connectionandroid.os.NetworkOnMainThreadException
  04-17 06:44:17.921: W/System.err(24207): java.lang.Exception
  04-17 06:44:17.921: W/System.err(24207):  at       com.mysql.android.MySQLAndroidActivity.onCreate(MySQLAndroidActivity.java:56)
  04-17 06:44:17.921: W/System.err(24207):  at       android.app.Activity.performCreate(Activity.java:4465)
  04-17 06:44:17.921: W/System.err(24207):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
  04-17 06:44:17.921: W/System.err(24207):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
  04-17 06:44:17.921: W/System.err(24207):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
  04-17 06:44:17.921: W/System.err(24207):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
  04-17 06:44:17.921: W/System.err(24207):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
  04-17 06:44:17.921: W/System.err(24207):  at android.os.Handler.dispatchMessage(Handler.java:99)
  04-17 06:44:17.921: W/System.err(24207):  at android.os.Looper.loop(Looper.java:137)
  04-17 06:44:17.931: W/System.err(24207):  at android.app.ActivityThread.main(ActivityThread.java:4424)
  04-17 06:44:17.931: W/System.err(24207):  at java.lang.reflect.Method.invokeNative(Native Method)
  04-17 06:44:17.931: W/System.err(24207):  at java.lang.reflect.Method.invoke(Method.java:511)
  04-17 06:44:17.931: W/System.err(24207):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  04-17 06:44:17.931: W/System.err(24207):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  04-17 06:44:17.931: W/System.err(24207):  at dalvik.system.NativeStart.main(Native Method)
</code>

EDIT2:

Hier ist etwas sehr ähnliches wie die Version, die ich mit AsyncTask erstellt habe (ich erstelle es im laufenden Betrieb, ohne einen Compiler, daher ist es möglicherweise nicht perfekt; aber es ist sehr ähnlich zu der, die ich zuvor gemacht habe):

<code>  @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

      new LoadTask().execute();

  }



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

            }

            @Override
            protected Void doInBackground(Void... params) {
                    synchronized (this) {

                    Looper.prepare();       
                    doStuff() //this method basically contains what it is inside the onCreate.

                    }

                    return null;
            }

       }
       }
</code>

- Ich erinnere mich, dass ich gezwungen war, 'Looper.prepare ()' zu verwenden. Also habe ich es vor 'doStuff ();' hinzugefügt.

EDIT 2:

<code>import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.net.ParseException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

public class MySQLAndroidActivity extends ListActivity {

    JSONArray jArray;
    String result = null;
    InputStream is = null;
    StringBuilder sb = null;
    HttpResponse response;
    HttpEntity entity;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        new LoadTask.execute();

    }



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

        }

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

            Looper.prepare();

            doStuff();



            return null;


        }
    }


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

            HttpPost httppost = new HttpPost("http://X.X.X.X/test.php");

            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 = "0";
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } 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();
        }
    }
}
</code>

Danke im Voraus,

N.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage