-4

アプリから Web リソースを取得しようとしていますが、NetworkOnMainThreadException が発生しています。Eclipse から試してみると、問題なく動作します。<uses-permission android:name="android.permission.INTERNET"/>AndroidManifest.xml ファイルに追加しましたが、まだ機能していません。-dns-server 8.8.8.8実行構成設定にも追加しましたが、まだ何も追加していません。正常に動作するエミュレーターでブラウザー アプリを開くと。何が間違っている可能性があるか、またはそれを修正する方法についての他の提案はありますか?

ありがとう!

java.net.InetAddress.lookupHostByName(InetAddress.java:385) の android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) での android.os.NetworkOnMainThreadException (java.net.InetAddress.getAllByNameImpl(InetAddress.java: 236) java.net.InetAddress.getAllByName(InetAddress.java:214) で libcore.net.http.HttpConnection.(HttpConnection.java:70) で libcore.net.http.HttpConnection.(HttpConnection.java:50) でlibcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) で libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) で libcore.net.http.HttpConnection.connect(HttpConnection.java: 128) libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) で libcore.net.http.HttpEngine.connect(HttpEngine.java:311) で。net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) で libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) で libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) で org .apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117) で javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:155) で com.weathertest.WeatherClient.getWeather(WeatherClient.java:41) ) com.weathertest.MainActivity$1.onClick(MainActivity.java:44) で android.view.View.performClick(View.java:4204) で android.view.View$PerformClick.run(View.java:17355) でandroid.os.Handler.handleCallback(Handler.java:725) で android.os.Handler.dispatchMessage(Handler.java:92) で android.os.Looper.loop(Looper.java:137) で android.app.ActivityThread .main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$ MethodAndArgsCaller.run(ZygoteInit.java:793) で com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) で dalvik.system.NativeStart.main(ネイティブ メソッド)

更新:インターネットのアクセス許可を追加した後に例外が変更されたことに気づかなかったと思います。以前に間違ったスレッドで何かを実行したために例外がスローされたのを見たことがありません。ほとんどの場合、それを実行したくないのは理にかなっていますが、例外は本当に...

指摘したように、これは良いリファレンスです: How to fix android.os.NetworkOnMainThreadException?

どうやらそれは Honeycomb SDK 以上のケースであり、考慮事項はここにあります: http://developer.android.com/training/articles/perf-anr.html

4

2 に答える 2

3

onCreate()メソッドのように、メイン UI スレッドからインターネットにアクセスしてはなりません。別のThread/Runnableまたはからインターネットコマンドを送信するAsyncTaskと、NetworkOnMainThreadException問題が解決されます。

Android では、代替スレッドで時間のかかるアクティビティを強制することで、長いタスク中に UI がハングしないようにするために、これを許可していません。

Thread thread = new Thread()
{
    @Override
    public void run() {
        talkToTheInternet();
    }
};
thread.start();

これは、可能な多くの方法の 1 つにすぎません。

おそらく、 を表示してProgressDialog、 が終了したら閉じることをお勧めしますThread。このフォーラムには、それを行うための多くの例があります。

于 2013-03-29T22:08:27.433 に答える
1

android.os.NetworkOnMainThreadException

これは、ほとんどのユーザーが Android アプリの開発を開始するときに直面する有名な例外です。

理由:
Android バージョン 3.x 以降のデバイスでは、UI スレッドでネットワーク操作を実行できません。実行しようとすると、UI スレッドでネットワーク操作を実行していることを示す例外がスローされます。したがって、ネットワーク操作または AsyncTask を実行する別のスレッドを作成する必要があります。

于 2013-03-29T22:11:07.897 に答える