在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,则有两种方法可以解决此问题: 方法1:需先在该线程中手动开启Looper(Looper.prepare()-...
在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,则有两种方法可以解决此问题: 方法1:需先在该线程中手动开启Looper(Looper.prepare()-...
Handler handler =newHandler(Looper.myLooper()) { @OverridepublicvoiddispatchMessage(@NonNull Message msg) { super.dispatchMessage(msg); String message= msg.getData().getString("msg"); Log.i("test","msg:"+message); } }; 调用: String message =newString(body); Message iMsg=handler.obtainMessag...
new Thread() { public void run() { Looper.prepare(); new Handler().post(runnable);//在⼦线程中直接去new ⼀个handler Looper.loop(); //这种情况下,Runnable对象是运⾏在⼦线程中的,可以进⾏联⽹操作,但是不能更新UI } }.start();⽅法2:通过Loop...
为什么在子线程中直接new Handler会报错: 我们从报错开始追踪:“Can’t create handler inside thread that has not called Looper.prepare()” —-》 错误日志就来自Handler的默认构造方法,源码如下: /** * Default constructor associates this handler with the queue for the ...
1 回复 #1 Forest_Deer class LooperThread extends Thread { public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } } 2015-08-22 回复 no...
是因为主线程会自动调用Looper.prepare()方法去给当前主线程创建并设置一个Looper对象,随意在Handler构造函数中从当前线程的对象身上拿到这个Looper。但是子线程中并不会自动调用这个方法,所以要想在子线程中创建Handler对象就必须在创建之前手动调用Looper.prepare()方法,否则就会报错。
Handler使用报错 android android中handler,在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化。有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。我们假设在一个UI界面上面,有一个按钮
当我们new Handler()的时候,最终调用了Handler的以下方法 /** * Default constructor associates this handler with the {@link Looper} for the * current thread. * * If this thread does not have a looper, this handler won't be able to receive messages ...
1、首先我们来看下,为什么在子线程里实例化的时候不调用Looper.prepare()就会报错呢? //我们先来看看new Handler();时出错的原因。后续讲解源码分析只贴出关键部分。//如下是Handler构造函数里抛出上文异常的地方,可以看到,由于mLooper对象为空才抛出的该异常。mLooper=Looper.myLooper();if(mLooper==null){throw...