2012-03-29 71 views
0

你好的Android程序员,解析Android中的JSON?

我想提出一个货币的应用程序,并做到这一点,我让我的汇率从以下网站(即返回JSON):

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

这里是方法在我的程序中获得网站上的所有费率。

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

此方法由于某种原因不起作用。现在我将发布LogCat以帮助我调试此方法。

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 

我已经证实,这种方法是问题的原因,因为我注释掉调用此方法并如期方案并功能。

+0

你能解决异常吗? – 2012-03-29 13:51:40

+0

[networkOnMainThreadException](http://stackoverflow.com/q/9729825/940096)这可以帮助你很多。 – Praveenkumar 2012-03-29 13:52:39

+0

你是什么意思?对不起,我不明白。我没有发布过LogCat吗? – sameetandpotatoes 2012-03-29 13:54:27

回答

2

您正试图通过Web从主线程获取您的JSON数据。从API lvl 10或11开始,我认为这会引发异常。考虑一下让这个平台告诉你在主线程上执行网络操作是一个非常糟糕的主意的人。将您的调用移入AsyncTask或使用线程/处理程序模式在后台完成您的工作。

+0

为了解决这个问题,我应该创建一个单独的类来扩展AsyncTask以获取更新的货币值? – sameetandpotatoes 2012-03-29 13:58:24

+0

是的,这是一种可以修复的方式。 – FoamyGuy 2012-03-29 14:03:18

1

引起:android.os。 NetworkOnMainThreadException

在Android Honeycomb及更高版本中,主UI线程上不允许执行网络操作。将它们移动到AsyncTask或服务。

+0

是的,你是对的。 – Praveenkumar 2012-03-29 13:54:48

+0

要解决这个问题,我应该创建一个单独的类来扩展AsyncTask以获取更新的货币值? – sameetandpotatoes 2012-03-29 13:58:01

1

您无法在Honeycomb上的UI线程上执行网络IO。 看到这篇文章: android.os.NetworkOnMainThreadException

+0

Chemik,所以我应该创建一个单独的类来扩展AsyncTask以获取更新的货币值? – sameetandpotatoes 2012-03-29 13:56:57

+0

是的,你应该阅读:[无痛线程](http://developer.android.com/resources/articles/painless-threading.html) – Chemik 2012-03-29 14:01:17