2013-05-08 9 views
20

Hier verwende ich diesen Code laden Json. Es ist gut funktionieren mit Android 2.2, aber wenn ich Android 4.2 verwende wirft es android.os.NetworkOnMainThreadException Ausnahme bitte geben Sie mir Lösungandroid.os.NetworkOnMainThreadException mit Android 4.2

public class JSONParser { 

    static InputStream is = null; 

static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(String url) { 

    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpPost = new HttpGet(url); 

      HttpResponse getResponse = httpClient.execute(httpPost); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 

      if (statusCode != HttpStatus.SC_OK) { 
       Log.w(getClass().getSimpleName(), 
        "Error " + statusCode + " for URL " + url); 
       return null; 
      } 

      HttpEntity getResponseEntity = getResponse.getEntity(); 

     //HttpResponse httpResponse = httpClient.execute(httpPost); 
     //HttpEntity httpEntity = httpResponse.getEntity(); 
     is = getResponseEntity.getContent();    

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d("IO", e.getMessage().toString()); 
     e.printStackTrace(); 

    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 

}

i auch Google api verwenden.

+0

Frage hat wurde hier beantwortet: http://stackoverflow.com/questions/5150637/networkonmainthreade xception –

+0

http://Stackoverflow.com/a/12615724/1168654 –

Antwort

73

schreiben unten Code in Ihre MainActivity Datei nach setContentView (R.layout.activity_main) verwendet wird;

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

Und unter Import-Anweisung in Ihre Java-Datei.

import android.os.StrictMode; 
+38

es ist nicht der richtige Weg, um StrictMode zu deaktivieren. Der korrekte Weg besteht darin, Netzwerkoperationen in AsyncTask aufzurufen, anstatt –

+0

zu deaktivieren. Wie @SankarV sagt, sollte dies mit einer AsyncTask erfolgen, anstatt strictmode zu deaktivieren. –

+0

Dies wird nicht empfohlen. AsyncTask ist eine bessere Möglichkeit, dies zu tun. –

6

Bitte stellen Sie sicher, dass Sie keine Netzwerkzugriff auf UI-Thread tun, es stattdessen tun in Async Task

Der Grund, warum Ihre Anwendung abstürzt auf Android-Versionen 3.0 und höher, aber auf Android 2.x funktioniert gut Denn seit HoneyComb gibt es viel strengere Übergriffe gegen den UI-Thread. Wenn beispielsweise ein Android-Gerät, auf dem HoneyComb oder höher läuft, einen Netzwerkzugriff auf den UI-Thread erkennt, wird eine NetworkOnMainThreadException ausgelöst.

Siehe this

+0

anstelle von HoneyComb und Ice Cream Sandwich werde ich seit HoneyComb sagen. In der Tat hat JB die gleiche Richtlinie – Blackbelt

1

android.os.NetworkOnMainThreadException tritt auf, wenn Sie versuchen, Netzwerk auf Ihrem Haupt-Thread zuzugreifen (Sie Hauptaktivitätsausführung). Um dies zu vermeiden, müssen Sie einen separaten Thread oder AsyncTask oder Runnable Implementierung erstellen, um Ihre JSON-Daten laden auszuführen. Seit HoneyComb kann der Netzwerk-Task im Haupt-Thread nicht mehr ausgeführt werden. Here ist die Implementierung AsyncTask für eine Netzwerk-Task-Ausführung

1

Verwenden StrictMode Etwas wie folgt aus: -

if (android.os.Build.VERSION.SDK_INT > 9) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

     StrictMode.setThreadPolicy(policy); 
     } 
+2

ist es nicht die richtige Art, StrictMode zu deaktivieren. Der richtige Weg besteht darin, Netzwerkoperationen in AsyncTask aufzurufen, anstatt sie auszuschalten. Wird der Check nur zum Ausschalten angeboten? –

+0

können wir asynkTask auch verwenden, aber für mich funktioniert es –

+0

ya wird es funktionieren, aber nicht der beste Weg. Sie haben die Überprüfung bereitgestellt, um sicherzustellen, dass der Entwickler die Netzwerkvorgänge in einem separaten Thread aufruft und nicht einfach abstellt. –

13

Dies ist der richtige Weg:

public class JSONParser extends AsyncTask <String, Void, String>{ 

    static InputStream is = null; 

static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 
@Override 
protected String doInBackground(String... params) { 


    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpPost = new HttpGet(url); 

      HttpResponse getResponse = httpClient.execute(httpPost); 
      final int statusCode = getResponse.getStatusLine().getStatusCode(); 

      if (statusCode != HttpStatus.SC_OK) { 
       Log.w(getClass().getSimpleName(), 
        "Error " + statusCode + " for URL " + url); 
       return null; 
      } 

      HttpEntity getResponseEntity = getResponse.getEntity(); 

     //HttpResponse httpResponse = httpClient.execute(httpPost); 
     //HttpEntity httpEntity = httpResponse.getEntity(); 
     is = getResponseEntity.getContent();    

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d("IO", e.getMessage().toString()); 
     e.printStackTrace(); 

    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 


} 
protected void onPostExecute(String page) 
{ 
    //onPostExecute 
} 
} 

es zu nennen (von main):

mJSONParser = new JSONParser(); 
mJSONParser.execute(); 
+0

hast du das sogar getestet? Funktioniert nicht was ist diese URL? return obj ist nicht zugänglich außerhalb der Schleife –

Verwandte Themen