2012-03-29 14 views
0

Hallo Android-Programmierer,Parsen von JSON in Android?

Ich bin eine Währung Antrag und dies zu tun, ich meine Währungsstabilitäten von der folgenden Website erhalten (die json zurückgibt):

https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

Hier ist die Methode, in meinem Programm, das alle Preise auf der Website findet.

public String[] fetchCurrencyRates() 
{ 
    String[] currencyValues = new String[currency_array.length]; //currency_array has the names of all the currencies 
    try 
    { 
     URL currency = new URL("https://raw.github.com/currencybot/open-exchange-rates/master/latest.json"); 
     URLConnection c = currency.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) 
     { 
      JSONArray ja = new JSONArray(line); 
      for (int i = 0; i < ja.length(); i++) 
      { 
       JSONObject jo = (JSONObject) ja.get(i); 
       currencyValues[i] = (jo.getString("rates")); 
      } 
     } 
    } 
    catch (MalformedURLException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (JSONException e) { 
    e.printStackTrace(); 
    } 
    return currencyValues; 
} 

Diese Methode funktioniert aus irgendeinem Grund nicht. Ich werde jetzt den LogCat veröffentlichen, um mir beim Debuggen dieser Methode zu helfen.

03-29 13:42:21.323: E/AndroidRuntime(678): FATAL EXCEPTION: main 
03-29 13:42:21.323: E/AndroidRuntime(678): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sapra.currency/com.sapra.currency.TheUltimateCurrencyConverterActivity}: android.os.NetworkOnMainThreadException 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.os.Looper.loop(Looper.java:137) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-29 13:42:21.323: E/AndroidRuntime(678): at java.lang.reflect.Method.invokeNative(Native Method) 
03-29 13:42:21.323: E/AndroidRuntime(678): at java.lang.reflect.Method.invoke(Method.java:511) 
03-29 13:42:21.323: E/AndroidRuntime(678): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-29 13:42:21.323: E/AndroidRuntime(678): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-29 13:42:21.323: E/AndroidRuntime(678): at dalvik.system.NativeStart.main(Native Method) 
03-29 13:42:21.323: E/AndroidRuntime(678): Caused by: android.os.NetworkOnMainThreadException 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
03-29 13:42:21.323: E/AndroidRuntime(678): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
03-29 13:42:21.323: E/AndroidRuntime(678): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
03-29 13:42:21.323: E/AndroidRuntime(678): at java.net.InetAddress.getAllByName(InetAddress.java:220) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
03-29 13:42:21.323: E/AndroidRuntime(678): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270) 
03-29 13:42:21.323: E/AndroidRuntime(678): at com.sapra.currency.TheUltimateCurrencyConverterActivity.fetchCurrencyRates(TheUltimateCurrencyConverterActivity.java:60) 
03-29 13:42:21.323: E/AndroidRuntime(678): at com.sapra.currency.TheUltimateCurrencyConverterActivity.onCreate(TheUltimateCurrencyConverterActivity.java:51) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.Activity.performCreate(Activity.java:4465) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-29 13:42:21.323: E/AndroidRuntime(678): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
03-29 13:42:21.323: E/AndroidRuntime(678): ... 11 more 

Ich habe bestätigt, dass diese Methode die Ursache des Problems ist, wie ich es wie erwartet der Aufruf dieser Methode und das Programm tat Funktion kommentiert.

+0

Können Sie die Ausnahme behandeln? –

+0

[NetworkOnMainThreadException] (http://StackOverFlow.com/q/9729825/940096) Dies kann Ihnen viel helfen. – Praveenkumar

+0

Was meinst du? Entschuldigung, ich verstehe es nicht. Habe ich das nicht schon gemacht, indem ich den LogCat gepostet habe? – sameetandpotatoes

Antwort

2

Sie versuchen, Ihre JSON-Daten über das Web aus dem Hauptthread abzurufen. Ab API lvl 10 oder 11 wird dies eine Ausnahme auslösen. Betrachten Sie es als die Leute, die die Plattform dazu bringen, Ihnen zu sagen, dass es eine sehr schlechte Idee ist, Netzwerkoperationen im Hauptthread durchzuführen. Verschieben Sie Ihren Anruf in eine AsyncTask oder verwenden Sie das Muster "Thread/Handler", um Ihre Arbeit im Hintergrund auszuführen.

+0

Um das zu beheben, sollte ich eine separate Klasse erstellen, die AsyncTask erweitert, um aktualisierte Währungswerte zu erhalten? – sameetandpotatoes

+0

Ja das ist eine Möglichkeit, dass es behoben werden kann. – FoamyGuy

1

Verursacht von: android.os. NetworkOnMainThreadException

In Android Honeycomb und höher sind Netzwerkvorgänge auf dem Haupt-UI-Thread nicht zulässig. Verschieben Sie sie in eine AsyncTask oder einen Service.

+0

Ja, Sie hatten Recht. – Praveenkumar

+0

Um das zu beheben, sollte ich eine separate Klasse erstellen, die AsyncTask erweitert, um aktualisierte Währungswerte zu erhalten? – sameetandpotatoes

1

Sie können Netzwerk-IO im UI-Thread von Honeycomb nicht ausführen. Siehe diesen Beitrag: android.os.NetworkOnMainThreadException

+0

Chemik, also sollte ich eine separate Klasse erstellen, die AsyncTask erweitert, um aktualisierte Währungswerte zu erhalten? – sameetandpotatoes

+0

Ja, Sie sollten dies lesen: [Schmerzloses Threading] (http://developer.android.com/resources/articles/painless-threading.html) – Chemik