0

ウェブサイトからテキストを取得し、Android プログラムのラベルをバッファリングされたリーダーの最後の行に変更するこのコードがあります。

編集 - Mohsen Afshin の親切なアドバイスのおかげで、コードを更新しました

button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        URL url = new URL(
                                "http://webpage.php");

                        URLConnection yc = url.openConnection();
                        yc.setDoOutput(true);
                        PrintStream ps = new PrintStream(yc
                                .getOutputStream());
                        ps.print("Name=Joe");
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(yc.getInputStream()));
                        String inputLine;
                        while ((inputLine = in.readLine()) != null)
                            display.setText(inputLine);
                        in.close();
                    } catch (IOException e) { // TODO Auto-generated catch
                                                // block
                        e.printStackTrace();
                        display.setText("failed");
                    }
                }
            });

            t.start();

現在、これはエミュレーターで完全に正常に機能しています。ただし、Android デバイスに配置すると、クラッシュします。インターネット接続を許可するように Android マニフェストを変更しました -

<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>

どこに問題があるのか​​ わかりません。奇妙なことに、一度は機能しました。再び動作しません。logcat は次のとおりです。

06-25 16:18:15.918: W/dalvikvm(9047): threadid=11: キャッチされない例外で終了するスレッド (group=0x411432a0) 06-25 16:18:15.923: E/AndroidRuntime(9047): 致命的な例外: スレッド-599 06-25 16:18:15.923: E/AndroidRuntime(9047): android.view.ViewRootImpl$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。06-25 16:18:15.923: E/AndroidRuntime(9047): android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4925) で 06-25 16:18:15.923: E/AndroidRuntime(9047): Android で。 view.ViewRootImpl.requestLayout(ViewRootImpl.java:950) 06-25 16:18:15.923: E/AndroidRuntime(9047): android.view.View.requestLayout(View.java:15461) 06-25 16:18: 15.923: E/AndroidRuntime(9047): android.view.View.requestLayout(View.java:15461) 06-25 16:18:15.923: E/AndroidRuntime(9047): android.view.View.

もっと知識のある人が私を助けてくれますか?

4

2 に答える 2

0

@NinadChilap で述べられているように、NetworkOnMainThreadException.

したがって、URL が有効な場合、これは機能します。

Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //To change body of implemented methods use File | Settings | File Templates.
                    URL url = new URL("http://weblink.php");

                    URLConnection yc = url.openConnection();
                    yc.setDoOutput(true);
                    PrintStream ps = new PrintStream(yc.getOutputStream());
                    ps.print("Name=Joe");
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(yc.getInputStream()));
                    String inputLine;
                    while ((inputLine = in.readLine()) != null)
                        display.setText(inputLine);
                    in.close();
                } catch (IOException e) { // TODO Auto-generated catch block
                    e.printStackTrace();
                    display.setText("failed");
                }
            }
        });

        t.start();
于 2013-06-25T13:53:15.957 に答える