1

「onCreate」メソッドには、コード行があり、

Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), "");

スマートフォン(Samsung Duos)で実行すると、うまく動作します。しかし、Toshiba Thrive タブレットで実行すると、"android.os.NetworkOnMainThreadException"例外が発生します。
なぜそれが起こるのですか?

4

3 に答える 3

3

以降の新しいバージョンの Android3.0では、メイン UI スレッドでネットワーク アクティビティを実行できません。とにかく悪いユーザーエクスペリエンスにつながるため、それらは自動的に殺されます。

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

これは、Honeycom SDK 以降を対象とするアプリケーションに対してのみスローされます。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません。

NetworkOnMainThreadException

別のスレッドで実行します。おそらくAsyncTaskを使用してください

于 2012-10-29T08:01:47.927 に答える
0

NetworkOnMainThreadExceptionは Android OS >=3.0 で発生します

そのため、常にAsyncTaskで Web リクエストを実行します

于 2012-10-29T08:00:53.830 に答える
0
    private class BackgroundLoginTask extends
AsyncTask<InputStream, Void, Boolean> {        

    @Override
    protected void onPreExecute() {

        // do something before..

        // Disable the UI-Elements during the login progress

        pbar.setVisibility(View.VISIBLE);
        editPassword.setEnabled(false);
        editUsername.setEnabled(false);
        btnLogin.setEnabled(false);

    }

    @Override
    protected Boolean doInBackground(final InputStream... params) {

        //do the network access
    }

    @Override
    protected void onPostExecute(final Boolean parsingError) {

        // enable the UI-Elements when the login was successful
        editPassword.setEnabled(true);
        editUsername.setEnabled(true);
        btnLogin.setEnabled(true);


        // hide the progress bar
        pbar.setVisibility(View.INVISIBLE);
    }
}

この小さな例では、AsyncTask がどのように機能するかを確認できます。3 つのメソッドをオーバーライドできます。バックグラウンド プロセスを開始する前に呼び出されるもの、アクセスを実行するもの、バックグラウンド プロセスを実行した後に呼び出されるものがあります。私の例では、UI 要素を無効にし、ネットワーク アクセスを行う前に進行状況バーを表示します。アクセス後、onPostExecute メソッドで UI 要素を有効にし、プログレスバーを無効にします。

次の抜粋されたコードでは、AsyncTask を呼び出す方法を確認できます。

public final void login(final View view) {
    BackgroundLoginTask task = new BackgroundLoginTask();
    task.execute();
}

この例がお役に立てば幸いです。

于 2012-10-29T08:30:31.113 に答える