所以在主线程中应用下列代码创建Handler对象时,就不会出错;而如果在新创建的非主线程操作中,应用下列代码创建Handler对象,就会报错 Handler handler = newHandler(); 1. 如果想要在非主线程中创建Handler对象,首先需要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建这个Handler对象,再使用Looper类的loop()...
但是这样去创建子线程的Handler可能会出现一定问题:looper指针为空,原因是当我们start子线程后,虽然子线程的run方法得到执行,但与此同时,主线程中的代码依然会向下执行,造成空指针的原因是当我们new Handler(childHandler.childLooper)的时候,run方法中的Looper对象还没初始化。 这时候我们可以使用Android给我们提供的Handl...
mProgressBar = findViewById(R.id.test_handler_progress_bar);//mHandler用于处理主线程消息队列中的子线程消息mHandler =newHandler(Looper.getMainLooper()) {@OverridepublicvoidhandleMessage(Message msg){super.handleMessage(msg);switch(msg.what) {case1://更新 TextView UImDisplayTv.setText("CustomChil...
为了Android UI的刷新google引入了Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用; AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的,比如一旦线程开启,即 dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的...
android 11中报new Handler()已过时 直接上代码: Handler handler =newHandler(Looper.myLooper()) { @OverridepublicvoiddispatchMessage(@NonNull Message msg) { super.dispatchMessage(msg); String message= msg.getData().getString("msg"); Log.i("test","msg:"+message);...
在Android中创建Handler的方法有以下三种: 使用Handler类的默认构造函数创建Handler对象: Handler handler = new Handler(); 复制代码 这种方式创建的Handler对象会与当前线程的Looper关联,因此可以在当前线程中使用该Handler进行消息处理。 使用Handler类的带有Looper参数的构造函数创建Handler对象: Handler handler = new ...
这要看你的工程线程是怎么创建的,普通的new Thread肯定不行。因为new Handler不崩溃的前提是当前线程...
我们可以给Hanlder传入一个Looper来防止出错比如new Handler(Looper.getMainLooper());或者在new Handler之前调用Looper.prepare(); textview.setText()这句代码只能在主线程中执行吗? 做我们大Android开发的都知道,不能再子线程中更新UI,但是如果我们new一个Thread在其run方法中调用textview.setText()方法,我们会发现...
handler.post(runnable); } }).start(); 二、源码分析 2.1、Handler 先从Handler构造函数开始 publicHandler(@NullableCallbackcallback,booleanasync){...mLooper=Looper.myLooper();if(mLooper==null){thrownewRuntimeException("Can't create handler inside thread "+Thread.currentThread()+" that has ...
可以看到我们平常写的 new Handler();其实是调用了另外一个构造方法,并且判断了mLooper是不是为空,为空则抛出一个异常"Can't create handler inside thread that has not called Looper.prepare()",mLooper其实是一个Looper类的成员变量,官方文档上对Looper类的解释是Class used to run a message loop for a ...