30

公式ドキュメントでNetworkOnMainThreadExceptionについて知りました

エミュレーターがこれをスローしているかどうか疑問に思っていました。私は自分のアプリをかなりテストしてきましたが、私が知る限り、すべてのネットワークは (Roboguice RoboAsyncTask を使用して) メイン スレッドから外れていますが、エスケープされていないかどうかはわかりません。

私も StrictMode を使用していますが、何も見ていません。

  1. 私のコードはきれいですか、それともエミュレーターでスローされませんか?

  2. 本番環境でこのような事態が発生した場合、どのように準備すればよいでしょうか?

  3. 猶予期間か何か?または、それは今経過しています;-) ??

4

5 に答える 5

13

ドキュメントにあるように、ハニカムを使用すると、メインスレッドでネットワーク操作を実行できません。このため、handler または asynctask を使用する必要があります。それを行う別の方法はありません。

ここでは、ネットワーク操作についてトルコ語で書かれた 2 つの例を見つけることができます。多分彼らは助けます。

于 2011-10-05T20:51:31.920 に答える
5

私はこれをテストしましたが、実際にはエミュレータでも発生します。アプリを 3.0 以降のタブレットに搭載する予定がある場合は、少なくともエミュレーターでアプリをテストしてください。

于 2011-03-04T20:56:18.107 に答える
1

3.0 を実行している場合は、どうしようもありません。Strict モードはデフォルトでオンになっているためです。しかし、その上に、これは役立つかもしれません

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

HTTP 接続を作成する前にこれを含めます。それからそれは動作します

于 2012-08-16T06:49:26.607 に答える
1

Honeycomb SDK (3) から、Google はネットワーク リクエスト (HTTP、ソケット) およびその他の関連操作をメイン スレッド クラスで直接許可しなくなります。実際、UI スレッドで直接ネットワーク操作を行うべきではなく、UI をブロックし、ユーザー エクスペリエンスが悪い!Googleが禁止されていなくても、通常の状況では、私たちはそれをしません~! つまり、Honeycomb SDK (3) のバージョンでは、メイン スレッドでも引き続き実行できますが、3 以上では動作しません。

1.使用Handler

Handlerネットワークに関連する時間のかかる操作は、子スレッドに配置され、メッセージング メカニズムを使用してメイン スレッドと通信されます。

public static final String TAG = "NetWorkException";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_net_work_exception);
    // Opens a child thread, performs network operations, waits for a return result, and uses handler to notify UI
    new Thread(networkTask).start();
}

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // get data from msg and notify UI
        Bundle data = msg.getData();
        String val = data.getString("data");
        Log.i(TAG, "the result-->" + val);
    }
};

/**
 * net work task
 */
Runnable networkTask = new Runnable() {

    @Override
    public void run() {
        // do here, the HTTP request. network requests related operations
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("data", "request");
        msg.setData(data);
        handler.sendMessage(msg);
    }
};

2.使用AsyncTask

public static final String TAG = "NetWorkException";
private ImageView mImageView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_net_work_exception);
    mImageView = findViewById(R.id.image_view);
    new DownImage(mImageView).execute();
}


class DownImage extends AsyncTask<String, Integer, Bitmap> {

    private ImageView imageView;

    public DownImage(ImageView imageView) {
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        String url = params[0];
        Bitmap bitmap = null;
        try {
            //load image from internet , http request here
            InputStream is = new URL(url).openStream();
            bitmap = BitmapFactory.decodeStream(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        // nodify UI here
        imageView.setImageBitmap(result);
    }
}

3.使用StrictMode

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
于 2017-09-22T07:48:16.480 に答える