1.Handler默认情况下与主线程处于同一线程

  1. public class MainActivity extends Activity {
  2.  
  3. private Button startButton = null;
  4. private Button endButton = null;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. startButton = (Button) findViewById(R.id.startButton);
  12. endButton = (Button) findViewById(R.id.endButton);
  13.  
  14. startButton.setOnClickListener(new StartButtonListener());
  15. endButton.setOnClickListener(new EndButtonListener());
  16.  
  17. /*
  18. * if (savedInstanceState == null) {
  19. * getSupportFragmentManager().beginTransaction() .add(R.id.container,
  20. * new PlaceholderFragment()).commit(); }
  21. */
  22. }
  23.  
  24. class StartButtonListener implements OnClickListener {
  25. @Override
  26. public void onClick(View v) {
  27. System.out.println(Thread.currentThread().getId() + " Start");
  28. handler.post(updateThread);
  29. }
  30. }
  31.  
  32. class EndButtonListener implements OnClickListener {
  33. @Override
  34. public void onClick(View v) {
  35. System.out.println(Thread.currentThread().getId() + " End");
  36. handler.removeCallbacks(updateThread);
  37. }
  38. }
  39.  
  40. Handler handler = new Handler();
  41. Runnable updateThread = new Runnable() {
  42. @Override
  43. public void run() {
  44. System.out
  45. .println(Thread.currentThread().getId() + " UpdateThread");
  46. handler.postDelayed(updateThread, 3000);
  47. }
  48. };

2.通过Handler实现进度条

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/container"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="vertical"
  7. tools:context="com.example.mars_1200_progressbarhandler.MainActivity"
  8. tools:ignore="MergeRootFrame" >
  9.  
  10. <TextView
  11. android:layout_width="fill_parent"
  12. android:layout_height="wrap_content"
  13. android:text="hello" />
  14.  
  15. <ProgressBar
  16. android:id="@+id/bar"
  17. style="?android:attr/progressBarStyleHorizontal"
  18. android:layout_width="200dp"
  19. android:layout_height="wrap_content"
  20. android:visibility="gone" />
  21.  
  22. <Button
  23. android:id="@+id/startButton"
  24. android:layout_width="fill_parent"
  25. android:layout_height="wrap_content"
  26. android:text="start" />
  27.  
  28. </LinearLayout>
  1. public class MainActivity extends Activity {
  2.  
  3. ProgressBar bar = null;
  4. Button startButton = null;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. System.out.println("主线程ID:"+Thread.currentThread().getId());
  12. bar = (ProgressBar) findViewById(R.id.bar);
  13. startButton = (Button) findViewById(R.id.startButton);
  14. startButton.setOnClickListener(new ButtonListener());
  15. /*
  16. * if (savedInstanceState == null) {
  17. * getSupportFragmentManager().beginTransaction() .add(R.id.container,
  18. * new PlaceholderFragment()).commit(); }
  19. */
  20. }
  21.  
  22. class ButtonListener implements OnClickListener {
  23. @Override
  24. public void onClick(View v) {
  25. bar.setVisibility(View.VISIBLE);
  26. updateBarHandler.post(updateThread);
  27. }
  28. }
  29.  
  30. //使用匿名内部类
  31. Handler updateBarHandler = new Handler() {
  32. //可传递参数
  33. @Override
  34. public void handleMessage(Message msg) {
  35. bar.setProgress(msg.arg1);
  36. updateBarHandler.post(updateThread);
  37. }
  38. };
  39.  
  40. //线程类,该类使用匿名内部类的方式进行声明
  41. Runnable updateThread = new Runnable() {
  42. int i = 0;
  43. @Override
  44. public void run() {
  45. System.out.println("Begin Thread");
  46. System.out.println("Handler线程ID:"+Thread.currentThread().getId());
  47. i = i + 10;
  48. //得到一个消息,Message类是有Android操作系统提供的
  49. Message msg = updateBarHandler.obtainMessage();
  50. //将msg对象的arg1参数的值设置为i,用arg1和arg2这两个
  51. //成员变量传递值,优点是消耗性能小
  52. msg.arg1 = i;
  53. try {
  54. Thread.sleep(1000);
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. updateBarHandler.sendMessage(msg);
  59. if (i >= 100) {
  60. updateBarHandler.removeCallbacks(updateThread);
  61. }
  62. }
  63. };

3.Handler通过post执行Runnable(还是与主线程处于同一线程)

  1. public class MainActivity extends Activity {
  2. private Handler handler = new Handler();
  3.  
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. //handler线程和主线程在同一线程
  9. handler.post(r);
  10. /*Thread t=new Thread(r);
  11. t.start();*/
  12.  
  13. System.out.println("activity-->" + Thread.currentThread().getId());
  14. System.out.println("activityname-->" + Thread.currentThread().getId());
  15. /*
  16. * if (savedInstanceState == null) {
  17. * getSupportFragmentManager().beginTransaction() .add(R.id.container,
  18. * new PlaceholderFragment()).commit(); }
  19. */
  20. }
  21.  
  22. Runnable r = new Runnable() {
  23. @Override
  24. public void run() {
  25. System.out.println("handler-->" + Thread.currentThread().getId());
  26. System.out.println("handlername-->"
  27. + Thread.currentThread().getName());
  28. try {
  29. Thread.sleep(10000);
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. };

4.通过HandlerThread执行线程,并可通过Bundle传递参数

  1. public class MainActivity02 extends Activity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main_activity02);
  7.  
  8. System.out.println(Thread.currentThread().getId());
  9. //生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android提供
  10. HandlerThread handlerThread=new HandlerThread("handler_Thread");
  11. handlerThread.start();
  12. MyHandler myHandler=new MyHandler(handlerThread.getLooper());
  13. Message msg=myHandler.obtainMessage();
  14. msg.obj="abc";//通过obj存储数据
  15. Bundle b=new Bundle();
  16. b.putInt("age", 20);
  17. b.putString("name", "Jhon");
  18. msg.setData(b);//通过Bundle存储数据
  19. msg.sendToTarget();//将msg发送到目标对象,所谓的目标对象就是生成该msg的Handler
  20. /*if (savedInstanceState == null) {
  21. getSupportFragmentManager().beginTransaction()
  22. .add(R.id.container, new PlaceholderFragment()).commit();
  23. }*/
  24. }
  25.  
  26. class MyHandler extends Handler{
  27. public MyHandler(){
  28.  
  29. }
  30. public MyHandler(Looper looper){
  31. super(looper);
  32. }
  33. @Override
  34. public void handleMessage(Message msg){
  35. System.out.println(msg.obj);
  36. Bundle b=msg.getData();
  37. System.out.println(b.getInt("age"));
  38. System.out.println(b.getString("name"));
  39. System.out.println("handleMessage:"+Thread.currentThread().getId());
  40. }
  41. }

Android之Handler的更多相关文章

  1. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  2. Android 测试Handler的基本使用

    package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; ...

  3. Android中Handler 、Thread和Runnable之间的关系

    在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...

  4. Android之Handler,举例说明如何更新UI

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

  5. Android之Handler用法总结(1)

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  6. Android之Handler用法总结

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  7. 【Android】Handler使用入门

    本讲内容:Handler使用入门 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上 ...

  8. Android的Handler与Activity线程同步

    假设这里有同一个Runnable对象r. 可能采用的方法有: 第一种: handler.post(r); 实际上这种方法并没有调用线程someThread的start方法,而是直接调用了Runaabl ...

  9. 【Android】Handler的应用(三):从服务器端分页加载更新ListView

    在前面两节中,我们了解了如何从服务器中加载JSON数据. 现在,我们将把服务器中的JSON数据加载更新到ListView. 并且,结合之前博文的  “动态追加分页ListView数据”的相关知识,实现 ...

  10. Android之Handler探索

    Handler背景理解: Handler被最多的使用在了更新UI线程中,但是,这个方法具体是什么样的呢?我在这篇博文中先领着大家认识一下什么是handler以及它是怎么样使用在程序中,起着什么样的作用 ...

随机推荐

  1. Unity资源管理与更新

    当你在 工程目录下的 Asset 文件夹中放置一个文件时(电脑上的文件夹,不是 Unity 界面中的文件夹),Unity会自动检测到一个新的文件被添加(Unity会不停地检查Assets文件夹中的内容 ...

  2. 转--基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    原文  http://www.cnblogs.com/wuhuacong/p/3317223.html 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用 在前面介绍了两篇关于我的基 ...

  3. js移动焦点到最后

      当输入框(input/textarea)获得焦点时,将焦点移动到最后,在某些情况下用户体验很好.网上的大部分方法都是针对IE浏览器的.代码如下: var el = document.getElem ...

  4. 透明度兼容性(ie8以上)

    转载:http://www.cnblogs.com/PeunZhang/p/4089894.html demo代码:文件中,背景透明,文字不透明的研究和使用.zip

  5. windows下脚本配置IP地址

    带着笔记本有时候在固定的地方工作,需要用到同一个的Ip地址.换个地方换个Ip,又要重新输一遍. 开始感觉这个过程很繁琐,因为是window工作环境,一开始想到了vbs脚本. 无意中发现了强大的nets ...

  6. oracle分析函数 之分组累加求和

    select s.slice_date_to ,s.made_id ,sum(s.steup_count)over(partition by s.made_id order by s.slice_da ...

  7. [转]StringUtils方法

    摘自http://blog.sina.com.cn/s/blog_4550f3ca0100qrsd.html org.apache.commons.lang.StringUtils中方法的操作对象是j ...

  8. C#使用RSA证书文件加密和解密示例

    修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...

  9. 【jmeter】JMeter测试MongoDB

    JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码方式测试MongoDB性能. 第一种方法 1.编写Java代码,内容如下: pa ...

  10. windows 2003 上安装windows liver writer

    下载"resource hacker"软件,修改exe文件,找到config--config0-0 替换为: <?xml version="1.0" en ...