Android 7.0及以上主线程上的一个TCP Socket的写入操作严格检查导致报错无法给服务器发送socket消息 Can’t create handler inside thread tha

释放双眼,带上耳机,听听看~!

由于之前的Android版本中的一项错误,系统没有对主线程上的一个TCP Socket的写入操作严格检查。

Android 7.0修复了这个系统错误。之前有这种行为的App将会引发android.os.NetworkOnMainThreadException。
一般情况下,不建议在主线程上执行网络操作,因为这些操作通常都有可能导致ANR和卡顿。同时在子线程中new Handler报错–Can’t create handler inside thread that has not called Looper.prepare()

在子线程中new一个Handler为什么会报以下错误

java.lang.RuntimeException: 

Can’t create handler inside thread that has not called Looper.prepare() 

这是因为Handler对象与其调用者在同一线程中,如果在Handler中设置了延时操作,则调用线程也会堵塞。每个Handler对象都会绑定一个Looper对象,每个Looper对象对应一个消息队列(MessageQueue)。如果在创建Handler时不指定与其绑定的Looper对象,系统默认会将当前线程的Looper绑定到该Handler上。
在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,则有两种方法可以解决此问题:

方法1:需先在该线程中手动开启Looper(Looper.prepare()–>Looper.loop()),然后将其绑定到Handler对象上;

final Runnable runnable = new Runnable() {
@Override
public void run() {
//执行耗时操作
try {

Log.e(“bm”, “runnable线程: ” + Thread.currentThread().getId()+ ” name:” + Thread.currentThread().getName());

Thread.sleep(2000);
Log.e(“bm”, “执行完耗时操作了~”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
new Thread() {
public void run() {
Looper.prepare();
new Handler().post(runnable);//在子线程中直接去new 一个handler
Looper.loop();    //这种情况下,Runnable对象是运行在子线程中的,可以进行联网操作,但是不能更新UI
}
}.start();

方法2:通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。

final Runnable runnable = new Runnable() {
@Override
public void run() {
//执行耗时操作
try {

Log.e(“bm”, “runnable线程: ” + Thread.currentThread().getId()+ ” name:” + Thread.currentThread().getName());
Thread.sleep(2000);
Log.e(“bm”, “执行完耗时操作了~”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
new Thread() {
public void run() {
new Handler(Looper.getMainLooper()).post(runnable);//在子线程中直接去new 一个handler

//这种情况下,Runnable对象是运行在主线程中的,不可以进行联网操作,但是可以更新UI
}
}.start();

人已赞赏
Android文章

Android 代码中设置TextView字体颜色

2020-3-24 8:49:30

Android文章

Android SurfaceView Camera 预览显示不全(画面拉伸)

2020-3-24 9:44:12

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索