Handler和线程是相关联的。再次强调:不可以在主线程中做耗时操作,就比如示例里面主线程中的 handlerMessage(),不能执行耗时操作。创建一个与自定义线程相关的Handler的代码:
class MyThread extends Thread{public Handler handler;@Overridepublic void run() {Looper.prepare(); // 创建Looper,默认情况是根据当前线程去拿到Looperhandler = new Handler(){ // 与子线程相关的Handler@Overridepublic void handleMessage(Message msg) {System.out.printf("currentThread:"+Thread.currentThread()); // 打印当前线程的id}};Looper.loop(); // 调用该方法实现对消息的循环处理}
}
要在线程中创建一个 Handler,需要先创建 Looper ,创建的方法很简单:Looper.prepare(); 之后就可以创建 Handler 了。在创建 Handler 之后别忘了调用 Looper.loop(); 这样才能实现对消息的循环处理。摘自评论区:
推荐博客一篇:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
主线程和子线程之间的交互的实现
本例的思路:
1. 在主线程中创建两个Handler对象 handler 和 handler2(图中是threadHandler),并直接初始化 handler,而handler2 不初始化。
2. 使用 HandlerThread 创建一个子线程 thread ,并启动 thread 。
3. 初始化 handler2(使用 thread 的 getLooper()作为参数),这样一来handler2就是子线程的 Handler 对象。
4. 重写 handler 和 handler2 的 handleMessage()方法,在里面创建Message对象,并使用对方的sendMessageDelayed(message,1000);方法发送消息。
5. 定义一个Button,定义点击事件,由点击事件触发如上交互的操作。如上操作中,第4点是核心,也就是两个 Handler 各自重写 handleMessage(),方法里面却是使用对方的 sendMessage() 方法。这样就实现了主线程和子线程的相互发送信息。
--------------
摘自评论区,亲测有效:
取消发送,经测试,需要将UIhandler  和 threadhandler中的message的what 设置为1,取消的时候要同时removeMessage(1);
 1 public class FourActivity extends Activity implements OnClickListener {
 2     private Button button1, button2;
 3     // 创建主线程的 Handler
 4     private Handler handler = new Handler() {
 5         public void handleMessage(android.os.Message msg) {
 6             Message message = new Message();
 7             System.out.println("----main handler");
 8             // 向子线程发送消息
 9             threadHandler.sendMessageDelayed(message, 1000);
10         };
11     };
12
13     private Handler threadHandler;
14
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         // TODO Auto-generated method stub
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.four);
20         button1 = (Button) findViewById(R.id.button1);
21         button2 = (Button) findViewById(R.id.button2);
22         button1.setOnClickListener(this);
23         button2.setOnClickListener(this);
24         HandlerThread thread = new HandlerThread("HandlerThread");
25         thread.start();
26         // 创建子线程的Handler
27         threadHandler = new Handler(thread.getLooper()) {
28             @Override
29             public void handleMessage(Message msg) {
30                 // TODO Auto-generated method stub
31                 Message message = new Message();
32                 System.out.println("----thread handler");
33                 // 向主线程发送消息
34                 handler.sendMessageDelayed(message, 1000);
35             }
36         };
37     }
38
39     @Override
40     public void onClick(View v) {
41         // TODO Auto-generated method stub
42         switch (v.getId()) {
43         case R.id.button1:
44             handler.sendEmptyMessage(1);
45
46             break;
47         case R.id.button2:
48             handler.removeMessages(1);
49             break;
50         }
51     }
52 }

转载于:https://www.cnblogs.com/my334420/p/6758675.html

Android攻城狮 Handler与子线程相关推荐

  1. Android攻城狮Handler简介

    Handler是什么? Handler是Android提供的一套用来更新UI的机制,也是一套消息处理机制,可以通过它发送消息,也可以通过它处理消息. 所有Activity生命周期回调的方法(例如onC ...

  2. 写给即将/正在找工作的Android攻城狮

    写给即将/正在找工作的Android攻城狮 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 这段时间从北上广深杭不断传来一两个月找不到工作的消息,我一 ...

  3. Android攻城狮组件篇—BroadcastReceiver

    组件篇-BroadcastReceiver 1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制. 2. BroadcastReceiver(广播接受者)是对发送出来的广播进行 ...

  4. 写给即将正在找工作的Android攻城狮,算法太TM重要了

    一.认识鸿蒙 鸿蒙 微内核是基于微内核的全场景分布式OS,可按需扩展,实现更广泛的系统安全,主要用于物联网,特点是低时延,甚至可到毫秒级乃至亚毫秒级. 鸿蒙OS实现模块化耦合,对应不同设备可弹性部署, ...

  5. Android攻城狮ListView

    适配器: 数据适配器:把复杂的数据填充在指定的视图界面上ArrayAdapter 数组适配器 用于绑定格式单一的数据 数据源:可以是集合或数组 SimpleAdapter 简单适配器:用于绑定格式复杂 ...

  6. Android攻城狮GestureDetector和GestureOverlayView

    手势识别 可以通过以下两种方式实现: 1. 使用GestureDetector 2. 使用GestureOverlayView(属于线程的控件)手势交互过程(原理): 1. 触屏一刹那,触发 Moti ...

  7. Android攻城狮ViewFlipper

    使用ViewFlipper实现屏幕切换动画效果. ViewFlipper和ViewPager一样,都是Android自带的一个多页面管理控件,不同的是ViewPager是手动切换页面,而ViewFli ...

  8. Android攻城狮OptionsMenu

    Android的菜单一共有三种: OptionsMenu 选择菜单 ContextMenu 上下文菜单 SubMenu 子菜单创建选项菜单: 在 Activity 里面重写 onCreateOptio ...

  9. Android攻城狮四大组件之Service

    组件篇--Service 当Android系统内存不足的时候,会杀死优先级别较低的Activity,而基本上Service的优先级要高于Activity,所以程序中如果含有 Service,那么该程序 ...

最新文章

  1. Oracle隐含参数:_allow_resetlogs_corruption
  2. Session对象的生命周期
  3. 用类氢轨道计算交换积分和Li原子2S谱项能级
  4. 24、SQL注入是什么,如何避免SQL注入?
  5. $\mathfrak {reputation}$
  6. 自定义JSP中的Taglib标签之四自定义标签中的Function函数
  7. 零基础Unreal Engine 4(UE4)图文笔记之粒子系统
  8. 有关JAVA中不同方法对String连接性能的总结
  9. 求三角形面积(C++)
  10. 模糊PID控制算法 之 C语言实现
  11. IntelliJ IDEA设置代码字体大小
  12. plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
  13. 「Mac小技巧」教你如何解决WiFi的国家地区代码冲突
  14. 正确解决:关于Lattic Diamond软件注册不成功(license问题)
  15. 圆内接等边三角形的画法_如何画出圆的内接正三角形
  16. java自动回复_java实现自动回复聊天机器人
  17. 网站打开速度标准及测试
  18. python每个if条件后面都要使用冒号_Python基础:条件控制if
  19. 第五日 高手篇:信用证全攻略
  20. 当年腾讯为什么从QQ转移扶植到微信,如今微信已撑起腾讯半壁江山

热门文章

  1. css第四课:id选择器及通配选择器
  2. 毒你没商量!DOC病毒原理完全解析(转)
  3. 阿里巴巴-1688-退款退货明细下载(导出)
  4. Win10磁盘管理器:轻松和安全地调整Win10的分区大小
  5. 中国好生意 经典论述:哈林是来主持的,刘欢是来开家长会的,那英是来唠嗑的,杨坤是来做宣传的,而......
  6. 修改hosts文件在本地调试微信JS-SDK
  7. 登录显示服务器端校验不通过,SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.57 SMTP;...
  8. C++Primer 第9章 顺序容器
  9. 三种方式让 Android WebView 支持文件下载
  10. 部落冲突-建筑大师基地军队建筑介绍(兵营、建筑大师训练营、星空实验室、战争机器)