2013-10-09 110 views
4
String response = getResultForRequest(url); 

其中'url'是JSON格式,它返回一堆使用http GET方法的數據。Android:造成:android.os.NetworkOnMainThreadException

public static String getResultForRequest(String urlString) 
     throws IOException { 
    URL url = new URL(urlString); 
    HttpURLConnection urlConnection = (HttpURLConnection) url 
      .openConnection(); 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoInput(true); 
    urlConnection.setDoOutput(true); 
    urlConnection.connect(); 

    InputStream is = urlConnection.getInputStream(); 
    if (is == null) 
     return null; 
    StringBuffer sb = new StringBuffer(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
    String line = null; 
    try { 
     while ((line = br.readLine()) != null) 
      sb.append(line); 
    } finally { 
     br.close(); 
     is.close(); 
    } 

    return sb.toString(); 
} 

我不能取JSON格式從其中i的getResultForRequest已通過 'URL' 數據(URL)method.I在urlConnection.connect得到一個錯誤();。互聯網權限也在AndroidManifest.xml文件中給出。

這是我的日誌。

10-09 13:27:35.264: E/AndroidRuntime(9984): FATAL EXCEPTION: main 
10-09 13:27:35.264: E/AndroidRuntime(9984): java.lang.RuntimeException: Unable to start activity ComponentInfo{}: android.os.NetworkOnMainThreadException 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.ActivityThread.access$600(ActivityThread.java:140) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.os.Looper.loop(Looper.java:137) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at dalvik.system.NativeStart.main(Native Method) 
10-09 13:27:35.264: E/AndroidRuntime(9984): Caused by: android.os.NetworkOnMainThreadException 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at com.csoft.foursquare.FoursquareService.getResultForRequest(Service.java:564) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at com.csoft.foursquare.FoursquareService.getUserDetails(Service.java:376) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at com.csoft.checkin.CheckinHistoryActivity.onCreate(HistoryActivity.java:52) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.Activity.performCreate(Activity.java:5206) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
10-09 13:27:35.264: E/AndroidRuntime(9984):  ... 11 more 

在此先感謝。

+2

請關閉這個問題,它已被問及回答了幾十億次 – njzk2

+0

要下載JSON,你可以使用「Volley」來爲你工作http://www.kpbird.com/2013/05/volley- easy-fast-networking-for-android.html –

回答

12

您正試圖在主(UI)線程上建立網絡連接。這在Android中是不允許的,因爲它會暫停整個用戶界面,直到您獲得服務器的響應。

嘗試使用AsyncTask或在單獨的線程上執行連接。

希望這會有所幫助。

2

NetworkOnMainThreadException:應用程序嘗試在其主線程上執行聯網操作時引發的異常。

你應該調用asynctask的方法,然後只有代碼才能工作。爲了避免它,你應該在另一個線程上調用它。因此,asynctask更好。

http://android-developers.blogspot.in/2009/05/painless-threading.html

http://android-er.blogspot.in/2012/04/androidosnetworkonmainthreadexception.html

http://www.lucazanini.eu/2012/android/the-android-os-networkonmainthreadexception-exception/?lang=en

這裏是鏈接,說明如何使用的AsyncTask

+0

謝謝@Tamilan。我完成了AsyncTask.But問題是,當我運行這個代碼,然後在4.0以上,然後數據不能從url中獲取。但在薑餅中,它完美地表示數據應該很好地顯示。我無法理解發生了什麼問題。 – Lawrance

+0

如果目標sdk版本> = 14或> = 15(我不確定,我很抱歉),這個異常會被拋出,只有 – Sandra

+0

@Sandra可能會給所有人 – Hariharan

26

在你的onCreate()補充一點:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

使用ABOV作爲臨時解決方案。否則使用線程或asynctask。

+5

請避免以上代碼..在docs中,您將看到:「對StrictMode非常沮喪」......似乎您正在主線程上執行一些網絡請求,您只需移動請求或respose。 getEntity到一個AsyncTask,這是你的問題的正確的解決方案.. –

+0

我說,已經在答案。只有使用給定的代碼作爲臨時解決方案,否則使用thread/asynctask。 – fida1989

相關問題