NetworkOnMainThreadException - PullRequest
       135

NetworkOnMainThreadException

26 голосов
/ 01 марта 2011

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

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

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

  1. Мой код просто чистый или он не отображается на эмуляторе?

  2. Как мы должны подготовиться к тому, что произойдет на производстве?

  3. А как насчет льготного периода или чего-то еще? Или это уже прошло ;-) ??

Ответы [ 5 ]

12 голосов
/ 06 октября 2011

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

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

5 голосов
/ 04 марта 2011

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

3 голосов
/ 20 мая 2016

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

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

внутри onCreate() метод.

1 голос
/ 22 сентября 2017

Из 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);
}
1 голос
/ 16 августа 2012

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

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

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

...