2

Webホスト(この場合は私のWebサイト)からディレクトリの内容を読み取れるようにする次のコードを見つけました

String urlStr = "http://2112design.com/tabs/drum_tabs";
URL url;
try {
    url = new URL(urlStr);
    java.net.URLConnection con = url.openConnection();
    con.connect();
    java.io.BufferedReader in =
      new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
    String line;
    for (; (line = in.readLine()) != null; ) {
        Log.d("MainActivity", "read from web "+line);
    }
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

これを実行すると、con.connect(); 次のようなエラー トレースで失敗します。

android.os.NetworkOnMainThreadException
android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
java.net.InetAddress.lookupHostByName(InetAddress.java:385)

ある種の権限の問題StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)があるようですが、同じデバイスで Web ブラウザーを使用してその URL にアクセスすると、正常に開きます。

私はウェブのことはあまり得意ではありません。誰か助けてください、ありがとう

4

4 に答える 4

5

たとえば、メイン スレッドでネットワーク リクエストを実行したり、AsyncTask を使用したり、新しいスレッドを開始したりしないでください。

     (new Thread(new Runnable() {

                                        @Override
                                        public void run() {
                                            try {
                                                url = new URL(urlStr);
                                                java.net.URLConnection con = url.openConnection();
                                                con.connect();
                                                java.io.BufferedReader in =
                                                  new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
                                                String line;
                                                for (; (line = in.readLine()) != null; ) {
                                                    Log.d("MainActivity", "read from web "+line);
                                                }
                                            } catch (MalformedURLException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }

                                        }
                                    })).start();

または、使用できます

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = 
             new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

詳細については、この質問を確認してください。

于 2013-01-23T12:26:52.953 に答える
4

これは、Android では許可されていないメイン スレッドからネットワークにアクセスしようとしているためです。

AsyncTask を使用するか、別のスレッドを作成してその中で操作を実行することができます

AsyncTask とスレッドのどちらを使用して実装するかについて不明な点がある場合は、お気軽にお問い合わせください。コードが必要な場合はお知らせください。

于 2013-01-23T12:23:37.607 に答える
2

UI スレッドでネットワーク操作を実行しています。それがあなたが得ている理由ですNetworkOnMainThreadException

コードをAsyncTaskに変更するか、問題を解決するスレッドに変更します。

于 2013-01-23T12:22:36.367 に答える
2

NetworkOnMainThreadException:アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。

asynctask で sendfeedback メソッドを呼び出す必要があります。そうすれば、上記のコードのみが機能します。Web サーバーの応答に時間がかかるため、メイン スレッドが応答しなくなります。それを避けるには、別のスレッドで呼び出す必要があります。したがって、asynctask の方が優れています。

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

ここに asynctask の使用方法を示すリンクがあります

于 2013-01-23T12:24:31.860 に答える