Ответ 1
Я тестировал это, и это действительно происходит и на эмуляторе. Лучше убедитесь, что вы тестируете свое приложение, по крайней мере, на эмуляторе, если вы планируете получить его на планшетах 3.0 и выше.
Я только что узнал о NetworkOnMainThreadException в официальных документах
и задавался вопросом, выбрасывает ли этот эмулятор. Я тестировал свое приложение совсем немного, и насколько я знаю, вся сетевая связь отключена от основного потока (с использованием Roboguice RoboAsyncTask), но вы никогда не знаете, не удалось ли его избежать.
Я также использую StrictMode и ничего не видел.
Является ли мой код просто чистым или это не выбрасывается на эмулятор?
Как мы должны готовиться к этому в производстве?
Как насчет льготного периода или чего-то еще? Или это и так прошло;-)??
Я тестировал это, и это действительно происходит и на эмуляторе. Лучше убедитесь, что вы тестируете свое приложение, по крайней мере, на эмуляторе, если вы планируете получить его на планшетах 3.0 и выше.
С сотой вы не можете выполнять сетевую операцию в своем основном потоке, как говорит документация. По этой причине вы должны использовать обработчик или асинтез. Другого способа это не сделать.
здесь вы можете найти 2 примера, написанные на турецком языке о сетевой работе. возможно, они помогают.
3. party kütüphane kullanmadan (ksoap2), (он включает перевод на английский язык)
AsyncTask class'tan dönen parametreyi handle etmek., google translate
Если вы используете 3.0, я не могу помочь; Поскольку режим Strict включен по умолчанию; Но его выше tat, то это может помочь
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Включить это перед созданием HTTP-соединения; Затем он работает
NetworkOnMainThreadException
возникает, когда некоторые сетевые операции выполняются внутри основного метода; Я имею в виду Oncreate()
. Вы можете использовать AsyncTask
для решения этой проблемы. или вы можете использовать
StrictMode.ThreadPolicy mypolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
внутри Oncreate()
.
От 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);
}