-
handler-4查看全部
-
handler-3查看全部
-
handler_2查看全部
-
handler_1查看全部
-
handler_1查看全部
-
handler是用来发送和处理消息的,更新UI的查看全部
-
handler 消息处理机制 更新UI界面查看全部
-
1.不能直接在非UI线程直接更新UI(大多数时候)。<br> 2.每次创建Handler时需要给它绑定一个looper,如果是主线程不给定具体的looper则会绑定默认的looper。<br> 3.子线程运行时一定要调用start()方法。<br> 4.在某些特殊情况下在非UI线程是可以更新UI的//不推荐使用(当刚启动Activity即onCreate里面此时onResume方法还没有执行的时候可以,因为在线程中更新UI时会调用ViewParent.invalidateChild()方法检查当前的Thread是否是UIThread,若为UIThread则可以更新(ViewParent是一个接口类,其实现是ViewRootImpl;invalidateChild()方法调用checkThread()方法来检查线程是否为主线程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl创建之前更新UI(在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp),就可以逃避掉checkThread()的检查进而更新UI。)查看全部
-
所有更新UI的操作,都要使用view的invalidate方法 settext方法中也使用了invalidate方法 invalidate(true) 判断UI线程 invalidateChild(this,null)中调用invalidateChildInParent方法 中使用checkThread,检查当前更新UI的操作是否在主线程之中 在Onresume方法中创建viewrootmp oncreate方法在onresume方法之前,所以在oncreate方法中没有检测子线程是否与UI线程相等查看全部
-
Android中更新UI的几种方式: 1. activity.runOnUiThread() 2. handler.post() 3. handler.sendMessage() 4. view.post()查看全部
-
1.创建主线程的handler,并向子线程发送消息: //主线程的handler Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { Message message = new Message(); threadHandler.sendMessageDelayed(message, 1000);//向子线程发送消息 }; }; 2.创建子线程的handler,向主线程发送消息,要关联一个threadHandler,threadHandler.getLooper()得到一个looper对象 HandlerThread handlerThread = new HandlerThread("handler thread"); handlerThread.start();//不要忘记调用start方法! //子线程的handler threadHandler = new Handler(handlerThread.getLooper()){ @Override public void handleMessage(Message msg) {//处理消息 Message message = new Message(); handler.sendMessageDelayed(message, 1000); } };查看全部
-
handlerThread 注意的地方 创建handler对象 指定Looper 在MyThread 的Looper对象 空指针异常 多线程并发 两个线程可能Looper没有创建 HandlerThread可以避免空指针问题 handlerThread对象 handler对象 thread.getLooper 原理判断线程是否或者 空则等待 run方法创建 Looper通知加线程同步的判断 默认所有的handlerThread中下载网络资源 把所有的任务的发送处理 调用handlerThread查看全部
-
自定义Thread MyThread extend Thead 调用 Looper.prepare 与子线程相关的handler handler和子线程关联 thread.sendMessage 如果在主线程中创建一个handler,并重写handlemessage方法,那么一定不要在这里执行耗时操作,这样有可能会将主线程卡死 创建一个与线程相关的Handler: 1. 在线程中通过Looper.prepare()方法创建一个与线程相关的Looper对象; 2. 在线程中通过Handler的new关键字,创建一个Handler对象,这个对象在创建的时候会关联上1中创建的Looper对象 3. 调用Looper对象的loop()方法去轮询它的MessageQueue 4. 通过其他的线程拿到这个线程的Handler对象之后调用sendMessage()之后,在这个线程中就可以进行Message的处理了。<br> <br> 我们一般是在主线程中创建Handler对象,在主线程中处理Message,在子线程中调用这个Handler对象的sendMessage()来发送message。所以Handler是在哪个线程创建就有哪个线程处理Message和轮询,而由别的线程负责给这个Handler发送Message。 * 每个线程都对应一个looper,在线程里面创建的handler默认都会与这个looper对应 * 一个线程可以有多个handler与唯一的一个looper对应,有且只有一个looper * 这里主要是让我们熟悉在oncreat创建的handler与子线程创建handler * oncreate创建的handler他默认里面会有一个looper与之对应 * 所以我们自己在子线程中创建handler对象的时候我们应该要自主创建一个looper查看全部
-
使用“Message”方式“发送消息”,使“Handler处理消息,并更新UI” 1.定义Handler,并且实例化,使用默认构造函数即可。 2.重写handlerMessage方法。 private Handler msgHandler=new Handler(){ //定义handler,重写处理message方法。当该handler发送消息的时候,这个方法会被执行。 public void handleMessage(android.os.Message msg) { //msg为当有sendMessage方法调用时,传过来的Message对象。 mTextView.setText("msg:"+msg.arg1); }; }; 3.定义Message对象。其中,Message提供了三个公共变量。arg1,arg2,obj,可以将消息放入其中,作为消息信息。然后发送消息即可 new Thread() { public void run() { Message message=msgHandler.obtainMessage();//从Handler对象中获取Message对象,而不是自己new,这样效率高。 message.arg1=1; message.sendToTarget(); //对于从handler对象中获取的message,可以直接使用该方法发送消息。 //msgHandler.sendMessage(message); //发送消息 }; }.start(); 知识拓展: 1。实例化Handler时,可以使用带一个Callback接口参数的构造函数。 其中Callback有一个未实现的方法。 这个方法有一个返回值(boolean) 2.当该Handler收到消息时,首先会调用Callback中的消息处理方法。 2.1 如果返回值为false,消息不会被截断。Handler依然可以处理该消息。 2.2 如果返回值为true,消息将会被截断。Handler中的处理消息方法不会被执行。查看全部
-
使用“Handler”更新UI 1.使用post或postDelayed()方法。 2.在子线程中可以调用post方法。来将更新UI消息加入到队列中。这样就可以更新UI了 其中。需要一个参数。Runnable,在run方法下写更新UI的操作即可。 new Thread(new Runnable() { @Override public void run() { /** * 将Runnable中要执行的内容加入消息队列。 * 可以在这之中更新ui * */ mHandler.post(new Runnable() { @Override public void run() { mTextView.setText("我是被更新后的值"); } }); } }).start(); 3.使用mHandler.postDelayed(myRunnable, 1000);更新UI同样道理,但是会在延迟时间之后执行。可以使用其来进行轮换操作查看全部
举报
0/150
提交
取消