博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Handler
阅读量:5290 次
发布时间:2019-06-14

本文共 4239 字,大约阅读时间需要 14 分钟。

      Android里面的界面的修改,不能直接用一个Thread的方法体来修改。每个Activity都有一个系统主线程一直在循环监听该界面数据是否有什么变化。如果直接新建一个线程来修改界面就会造成多个线程不同步的现象,因此Android引入了Handler来处理多线程对界面进行的操作,个人理解Handler就相当于一个消息池,一旦有界面改变的消息就发送给系统界面主线程让其进行处理。

Handler对界面修改的消息处理大概有这么两种方式:

1、新建一个Runnable对象,但是Runnable()对象里面不要死循环,而是在主线程体里面用死循环来不断的监视界面变化,并用Handler对象来发送该消息

Runnable rb=new Runnable()       {        public  void run()              {                     position=(position++)%16+1;                     System.out.println("===position:   "+(position-1));                     if(position!=1)                     {                            vcbutton.elementAt(position-2).setImageResource(R.drawable.a22_02);                     }                     else                            vcbutton.elementAt(15).setImageResource(R.drawable.a22_02);                     vcbutton.elementAt(position-1).setImageResource(R.drawable.a22);              }       };

 

  在主线程体里面循环监听:

buttonstart.setOnClickListener(new OnClickListener() {                                                       public void onClick(View arg0) {                                   if(count>0)                                   {                                   // TODO Auto-generated method stub                                   //每次重新开始的时候把中间的图片显示为问好                                   centerbutton.setBackgroundResource(R.drawable.a21);                                   //点击开始的时候把当前位置的前景图片修改一下                                   vcbutton.elementAt(position-1).setImageResource(R.drawable.a22_02);                                   new Thread()                                   {                                          public void run()                                          {                                                                                   isstop=false;                                   for(;;)                                   {                                          //这里必须延迟发送,不染的话屏幕的刷新速度没有那么快就会出现延迟卡屏                                          handler.postDelayed(rb,250);                                          handler.post(rb2);                                          System.out.println("=====================position:   "+position);                                          try {                                                 Thread.sleep(sleeptime);                                          } catch (InterruptedException e) {                                                 // TODO Auto-generated catch block                                                 e.printStackTrace();                                          }                                          //这里遇到了一个问题,handler发送消息有延迟,屏幕刷新不够快                                          sleeptime+=addtime;                                          addtime+=5;                                          if(sleeptime>=500)                                          {                                                 isstop=true;                                                 isjieshu=true;                                                 handler.post(rb2);                                                 sleeptime=50;                                                 addtime=1;                                                 break;                                          }                                   }                                   }                            }.start();                                                       }}});

 

   这里还遇到了一个很有趣的问题,那就是屏幕刷新的问题。如果有消息就发送给主线程的话可能会由于界面屏幕刷新速度跟不上而出现延迟。因此最好在发送消息的时候给赋予足够的延迟时间

 

2、重写Handler的处理消息的方法,在该方法中对界面个元素进行修改

class MyHandler extends Handler {               @Override              public void handleMessage(Message msg) {                     super.handleMessage(msg);                       {// 444 第三种方法的消息处理                      number++;                      tv1.setText(number + "");// 修改TextView内容                      }

 

在主线程里面循环监听,将消息添加到消息池中:

      

Message msg = myHandler.obtainMessage();                     // // 吧Message对象添加进Handler的Message容器                             myHandler.sendMessage(msg);

 

为了让我们的程序更加严谨:确保在Activity生命周期结束的时候我们自己写的界面更新线程能正确退出,通常在Activity的ondestroy函数里面添加消息移除函数

 handler.removeCallbacks(runnable);

转载于:https://www.cnblogs.com/totem1990/archive/2012/09/02/2668077.html

你可能感兴趣的文章
python常见问题及解决
查看>>
[原创]Java 的传值小例子
查看>>
【MySQL学习】安装和配置 服务无法启动 没有报告任何错误
查看>>
C# 修饰符
查看>>
JavaScript启示录
查看>>
我需要什么样的浏览器?
查看>>
取textaera里的值
查看>>
java设计模式1--工厂方法模式(Factory Method)
查看>>
博客第一弹—聊聊HTML的那些事
查看>>
上海2017QCon个人分享总结
查看>>
HIVE快速入门 分类: B4_HIVE 2015-...
查看>>
Mysql安装方法及安装问题解决
查看>>
Java动态代理的两种实现方式:
查看>>
PHP trait
查看>>
Redis的常用命令(三)
查看>>
HDOJ 4749 Parade Show
查看>>
python 多线程并发threading & 任务队列Queue
查看>>
【黑马程序员】资深程序员的见解
查看>>
1_fbauto
查看>>
IO体系、集合体系、多线程、jdbc
查看>>