我刚在官方文档中发现了NetworkOnMainThreadException
我想知道模拟器是否会抛出此异常。我已经对我的应用进行了相当多的测试,据我所知所有的网络操作都不是在主线程(使用Roboguice RoboAsyncTask),但你永远不知道是否漏掉了一些。
我还使用StrictMode,并没有看到任何异常。
我的代码只是干净的,还是模拟器上没有抛出这个异常?
我们应该如何为在生产中出现这种情况做好准备?
是否有优雅的期限或者其他方式?或者已经过期了吗 ;-)?
我刚在官方文档中发现了NetworkOnMainThreadException
我想知道模拟器是否会抛出此异常。我已经对我的应用进行了相当多的测试,据我所知所有的网络操作都不是在主线程(使用Roboguice RoboAsyncTask),但你永远不知道是否漏掉了一些。
我还使用StrictMode,并没有看到任何异常。
我的代码只是干净的,还是模拟器上没有抛出这个异常?
我们应该如何为在生产中出现这种情况做好准备?
是否有优雅的期限或者其他方式?或者已经过期了吗 ;-)?
根据文档,使用honeycomb不能在主线程上执行网络操作。因此,您必须使用handler或asynctask。没有其他方法可以做到这一点。
这里有两个用土耳其语编写的关于网络操作的示例,也许它们会有所帮助。
不使用第三方库(ksoap2),(包括英语翻译)
NetworkOnMainThreadException
是指在主线程中执行某些网络操作时发生的异常,比如在 Oncreate()
方法中。为了解决这个问题,你可以使用 AsyncTask
,或者你也可以使用
StrictMode.ThreadPolicy mypolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
在 onCreate()
方法内部。
onCreate()
中。 - David WasserHandler
将与网络相关的耗时操作放入子线程中,然后使用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);
}
};
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);
}
如果您正在运行3.0版本,我无法提供帮助;因为它默认启用了严格模式;但如果您的版本高于此,那么这可能会有所帮助。
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
NetworkOnMainThreadException
**的博客文章以获取更多信息...它非常有帮助! - Alex Lockwood