前言:

当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。
以下模拟一个简单的小球上下跳动的案例来分析Handler的工作模式。

源码:

MyView.java

public class MyView extends View {// 图形当前坐标private int x = 20, y = 20;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public MyView(Context context, AttributeSet attrs) {super(context, attrs);this.setFocusable(true);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 实例化画笔Paint p = new Paint();// 设置画笔颜色p.setColor(Color.GREEN);// 画图canvas.drawCircle(x, y, 10, p);}}

MainActivityDraw.java

public class MainActivityDraw extends Activity {private MyView myView;private MyHandler mHandler;private static final int UPDATE = 1;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);myView = (MyView) findViewById(R.id.myView);// myView是主线程里的UI,所以不能在子线程里更新mHandler = new MyHandler();// 在主线程中创建Handler ,该Handler与主线程进行了绑定// 匿名子线程对象new Thread() {public void run() {//只要当前线程没有被打断,就一直循环while (!Thread.currentThread().isInterrupted()) {System.out.println("Thread------id------>"+Thread.currentThread().getId());//显示子线程idSystem.out.println("Thread------name------>"+Thread.currentThread().getName());//显示子线程nameMessage msg = mHandler.obtainMessage(UPDATE);//这一个要放在while循环里面mHandler.sendMessage(msg);//发送一个消息给mHandlertry {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}private class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {System.out.println("handle--id-->"+Thread.currentThread().getId());//1System.out.println("handle--name-->"+Thread.currentThread().getName());//显示为main主线程super.handleMessage(msg);switch (msg.what) {case UPDATE:// 在收到消息时,对界面进行更新 ,Handler处于主线程,可以对UI进行更新updatePoint();//更新myView里的画笔坐标myView.invalidate();//更新myViewbreak;}}}// 更新坐标private void updatePoint() {int h = myView.getHeight();int y = myView.getY();y = y + 5;if (y >= h) {y = 20;}myView.setY(y);//很关键,要将更新过后的Y的值传过去}}

验证结果:

运行界面:

案例源码:

csdn资源下载(免费):http://download.csdn.net/detail/a13429921973/5725107

特别提醒:

本博客部分参考:http://rd.189works.com/article-12493-1.html

详情请参考该网址

更多相关文章

  1. Android主线程looper是死循环问题
  2. android的Thread、Runnable、Asyntask的区别与联系
  3. Android基于IIS的APK下载(三)用JSON传输更新数据
  4. Study on Android【六】--消息机制,异步和多线程
  5. Android_个人中心_修改个人信息
  6. [置顶] 我的Android进阶之旅------>Android基于HTTP协议的多线程
  7. Android-几行代码通知系统自动安装apk
  8. 实现Android监控任意控件或按键双击事件方法
  9. Android中后台定时任务实现,即时数据同步问题思考!

随机推荐

  1. 我的构建可以规定我的代码覆盖范围永远不
  2. 从零开始学_JavaScript_系列(65)——class
  3. Tomcat version 7.0仅支持J2EE 1.2、1.3
  4. Selenium InternetExplorerDriver无法找
  5. 适配器模式和外观模式
  6. jsoup 分页抓取网页数据Java HTML Parser
  7. [LeetCode] 212. Word Search II 词语搜
  8. Blue Pelican Java项目“Masking Telemet
  9. java入门第三篇-面向对象;
  10. 错误:警告:无法从javaldx读取路径