NetworkOnMainThreadException

Я только что узнал о NetworkOnMainThreadException в официальных документах

и задавался вопросом, выбрасывает ли этот эмулятор. Я тестировал свое приложение совсем немного, и насколько я знаю, вся сетевая связь отключена от основного потока (с использованием Roboguice RoboAsyncTask), но вы никогда не знаете, не удалось ли его избежать.

Я также использую StrictMode и ничего не видел.

  • Является ли мой код просто чистым или это не выбрасывается на эмулятор?

  • Как мы должны готовиться к этому в производстве?

  • Как насчет льготного периода или чего-то еще? Или это и так прошло;-)??

Ответ 1

Я тестировал это, и это действительно происходит и на эмуляторе. Лучше убедитесь, что вы тестируете свое приложение, по крайней мере, на эмуляторе, если вы планируете получить его на планшетах 3.0 и выше.

Ответ 2

С сотой вы не можете выполнять сетевую операцию в своем основном потоке, как говорит документация. По этой причине вы должны использовать обработчик или асинтез. Другого способа это не сделать.

здесь вы можете найти 2 примера, написанные на турецком языке о сетевой работе. возможно, они помогают.

Ответ 3

Если вы используете 3.0, я не могу помочь; Поскольку режим Strict включен по умолчанию; Но его выше tat, то это может помочь

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

Включить это перед созданием HTTP-соединения; Затем он работает

Ответ 4

NetworkOnMainThreadException возникает, когда некоторые сетевые операции выполняются внутри основного метода; Я имею в виду Oncreate(). Вы можете использовать AsyncTask для решения этой проблемы. или вы можете использовать

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

внутри Oncreate().

Ответ 5

От Honeycomb SDK (3) Google больше не будет разрешать сетевые запросы (HTTP, Socket) и другие связанные операции непосредственно в классе Main Thread, по сути, не должен выполнять прямую сетевую операцию в потоке пользовательского интерфейса, блокируя пользовательский интерфейс, плохой пользовательский опыт! Даже если Google не запрещен, при нормальных обстоятельствах мы этого не сделаем ~! Так, например, в версии Honeycomb SDK (3) вы также можете продолжать делать это в главной теме, более 3, она не будет работать.

1.use 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.use 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.use StrictMode

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}