0

インターネット上のチュートリアルの 1 つから非常に単純な例を実行しようとしています。しかし、実行できません。http getリクエストをサーバーに送信すると例外が発生します....サーバーにリクエストを送信するまで、コードは正常に実行されます。

HttpExample クラス:

    public class HttpExample extends Activity {

        TextView httpStuff;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.httpex);
            httpStuff = (TextView) findViewById(R.id.tvHttp);
            GetMethodEx test = new GetMethodEx();
            String returned;
            try {
                returned = test.getInternetData();
                httpStuff.setText(returned);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText(HttpExample.this, "Failed", Toast.LENGTH_LONG)
                        .show();
            }

        }

        public class GetMethodEx {

            public String getInternetData() throws Exception {
                BufferedReader in = null;
                String data = null;
                try {
                    HttpClient client = new DefaultHttpClient();
                    URI website = new URI("http://www.mybringback.com/");
                    HttpGet request = new HttpGet();
                    request.setURI(website);
                    HttpResponse response = client.execute(request);
                    // Toast.makeText(HttpExample.this, "Here",
                    // Toast.LENGTH_LONG).show();

                    in = new BufferedReader(new InputStreamReader(response
                            .getEntity().getContent()));
                    StringBuffer sb = new StringBuffer("");
                    String l = "";
                    String nl = System.getProperty("line.separator");
                    while ((l = in.readLine()) != null) {
                        sb.append(l + nl);
                    }
                    in.close();
                    data = sb.toString();
                    return data;
                } finally {
                    if (in != null) {
                        try {
                            in.close();
                            return data;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }

    }

Android Manifest.xml : インターネット権限も有効にしました

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.httpclient"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="16" />

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

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.httpclient.HttpExample"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

サーバーからデータを送受信するために非常に多くの他のコードを実行したため、何が問題なのかわかりませんが、それらも実行されないため、エミュレーターまたは何かの問題である可能性があります...これについて教えてくださいクラスコードとマニフェストは次のとおりです……

4

3 に答える 3

1

オプション1:

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

オプション 1 は、テストする場合にのみ適しています。AsyncTaskただし、この方法を実際に使用することは避けてください。

//================================================ ===========================
オプション 2:

このチュートリアルを使用して、適切な ASyncTask を作成しました: http://www.elvenware.com/charlie/development/android/SimpleHttpGetThread.html

//================================================ ===========================
最終的に ASyncTask を使用しました (オプション 2)。

于 2013-01-18T13:34:27.993 に答える
0

デバイスからインターネットに接続することを確認します。

テキストビューにテキストを設定する場合は、単純なテキストをダウンロードしてみてください: http://weather.yahooapis.com/forecastrss?w=2502265

于 2013-01-18T13:37:11.807 に答える
0

logcat の出力を確認するとNetworkOnMainThreadException、メイン スレッドで長時間実行されるタスク (Web 呼び出し) を直接実行していることを意味します。

このような長時間実行されるタスクを実装するには、AsyncTaskを実装するか、Web 呼び出しを行うための Threading 実装を実装できます。

参考までに、AsyncTask は無痛スレッド化として知られており、スレッド化プロセスについて気にする必要がないことを意味します。

メソッドの 1 つに Web 呼び出しを実装します。1 つのdoInBackground()例は、AsyncTaskのドキュメントに既に記載されています。

于 2013-01-18T13:27:08.600 に答える