0

重複の可能性:
Android HttpClient : NetworkOnMainThreadException

get リクエストを受信し、コンテンツをメール送信する php スクリプトがサーバー上にあります。http://url.com/testmail.php?message=somemessageがあるとしましょう

「メッセージ」の内容がメールで送信されます。

アプリでこのスクリプトを呼び出して、独自のメッセージをリクエストに挿入できるようにしたいと考えています。主にユーザーからのフィードバックに使用されます。POST を使用するほうがよいことはわかっています。メールをネイティブに処理できる Android 機能があれば、初心者なので教えてください。

これは、現時点でメイン アクティビティ「onCreate」内にあるコードで、例外を生成しています。

HttpClient httpClient = new DefaultHttpClient();  
    String url = "http://someurl/testmail.php?message=eventualjavavariable";
    HttpGet httpGet = new HttpGet(url);
    try {
        HttpResponse response = httpClient.execute(httpGet);
        StatusLine statusLine = response.getStatusLine();
        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
            HttpEntity entity = response.getEntity();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            entity.writeTo(out);
            out.close();
            String responseStr = out.toString();
            // do something with response 
        } else {
            // handle bad response
        }
    } catch (ClientProtocolException e) {
        // handle exception
    } catch (IOException e) {
        // handle exception
    }

また、Android マニフェスト ファイルに次の行を追加しました。

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

私は何を間違っていますか?

これは私のLogCatです:

10-09 15:12:33.185: E/AndroidRuntime(5561): java.lang.RuntimeException: Unable to start activity    ComponentInfo{com.example.android.fragments/com.example.android.fragments.MainActivity}: android.os.NetworkOnMainThreadException
10-09 15:12:33.185: E/AndroidRuntime(5561):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-09 15:12:33.185: E/AndroidRuntime(5561):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-09 15:12:33.185: E/AndroidRuntime(5561):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-09 15:12:33.185: E/AndroidRuntime(5561):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
4

3 に答える 3

1

メイン UI スレッドでのネットワーク アクティビティが原因でアプリケーションがクラッシュしていますが、これ自体はあまり良い方法ではありません。アプリケーションが応答を停止し、OS によって強制終了される可能性があるためです。バックグラウンド処理は、メインの UI スレッドではなく、別のスレッドで行うようにしてください。

おそらくAsyncTaskを使用して、バックグラウンド スレッドで HttpConnection を作成する必要があります。

于 2012-10-09T19:34:38.080 に答える
0

例外の名前が示すように、メイン スレッドでネットワーク操作を実行することはできません。リファレンス ドキュメントを参照してください。

于 2012-10-09T19:35:11.133 に答える
0

アプリケーションがメイン スレッドでネットワーク操作を実行しようとすると、NetworkOnMainThreadException がスローされますこれは、Honeycom SDK 以降を対象とするアプリケーションに対してのみスローされます。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません。ICS と HoneyComb が UI スレッドで実行できないその他の操作の例を次に示します。

  1. Socket 接続を開く (つまり、new Socket())。
  2. HTTP リクエスト (つまり、HTTPClient および HTTPUrlConnection)。
  3. リモートの MySQL データベースに接続しようとしています。
  4. ファイルのダウンロード (つまり、Downloader.downloadFile())。

これらの操作のいずれかを UI スレッドで実行しようとしている場合は、それらをワーカー スレッドでラップする必要があります。これを行う最も簡単な方法は、ユーザー インターフェイスで非同期作業を実行できるAsyncTaskを使用することです。AsyncTaskはワーカー スレッドでブロッキング操作を実行し、結果を UI スレッドに公開します。スレッドやハンドラーを自分で処理する必要はありません。

于 2012-10-09T19:44:35.127 に答える