我刚刚在官方文档中发现了NetworkOnMainThreadException
并且想知道模拟器是否正在抛出这个。我已经对我的应用程序进行了相当多的测试,据我所知,所有网络都在主线程之外(使用 Roboguice RoboAsyncTask),但你永远不知道是否有人没有逃脱。
我也在使用 StrictMode 并没有看到任何东西。
我的代码是干净的还是没有在模拟器上抛出?
我们应该如何为生产中发生的这种情况做准备?
宽限期之类的呢?或者现在已经过去了;-) ??
我刚刚在官方文档中发现了NetworkOnMainThreadException
并且想知道模拟器是否正在抛出这个。我已经对我的应用程序进行了相当多的测试,据我所知,所有网络都在主线程之外(使用 Roboguice RoboAsyncTask),但你永远不知道是否有人没有逃脱。
我也在使用 StrictMode 并没有看到任何东西。
我的代码是干净的还是没有在模拟器上抛出?
我们应该如何为生产中发生的这种情况做准备?
宽限期之类的呢?或者现在已经过去了;-) ??
如文档所述,使用honeycomb,您无法在其主线程上执行网络操作。出于这个原因,您必须使用处理程序或异步任务。没有其他方法可以做到这一点。
在这里您可以找到 2 个用土耳其语编写的关于网络操作的示例。也许他们有帮助。
我已经对此进行了测试,实际上它也确实发生在模拟器上。如果您打算将应用程序安装到 3.0 及更高版本的平板电脑上,最好确保至少在模拟器上测试您的应用程序。
NetworkOnMainThreadException
在 main 方法内部执行一些网络操作时发生;我的意思是Oncreate()
。你可以AsyncTask
用来解决这个问题。或者你可以使用
StrictMode.ThreadPolicy mypolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
内部onCreate()
方法。
如果您在 3.0 上运行,我无能为力;因为它默认开启了严格模式;但它的上面,那么这可能会有所帮助
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
在你的 HTTP 连接创建之前包括这个;然后它工作
从 Honeycomb SDK(3) 开始,Google 将不再允许直接在 Main Thread 类中进行网络请求(HTTP、Socket)等相关操作,实际上不应该在 UI 线程中直接进行网络操作,阻塞 UI,用户体验是坏的!就算不禁止谷歌,一般情况下,我们也不会这样做~!所以,也就是在Honeycomb SDK(3)版本中,你也可以在Main Thread中继续这样做,超过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);
}