web-dev-qa-db-ja.com

Android:原因:Android.os.NetworkOnMainThreadException

String response = getResultForRequest(url);

「url」はJSON形式で、http GETメソッドを使用して一連のデータを返します。

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

GetResultForRequest(url)メソッドで渡した 'url'からJSON形式のデータをフェッチできません。rlConnection.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

前もって感謝します。

7
Dhruv

これをonCreate()に追加します。

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

上記を一時的な解決策として使用してください。それ以外の場合は、threadまたはasynctaskを使用します。

29
fida1989

メイン(UI)スレッドでネットワーク接続を確立しようとしています。これは、Android=)では許可されていません。サーバーから応答を受け取るまで、UI全体が停止するためです。

AsyncTaskを使用するか、別のスレッドで接続を実行してください。

お役に立てれば。

12
Gil Moshayof

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の使用方法を示すリンクがあります

2
Hariharan