- 浏览: 930887 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
Handler: 主线程如何通知子线程
分类: Android 2012-01-02 10:48 4772人阅读 评论(18) 收藏 举报
在 android 中,不可以在子线程中更新 UI 的操作,否则会报错或者异常信息。
在这种情况下,我们会使用 Handler(在 UI 线程创建该对象) 接收子线程的消息更新 UI.
可以看出,这是子线程通知主线程,而主线程没有直接通知子线程,那麽我们如何做到这一点?这样有什么好处?
好处,很明显。主线程中如果有些耗时的操作,我们可以让子线程去做,这时,主线程就可以通知子线程了!
实现这种操作的方式有很多,今天主要想说说 HandlerThread 与 Handler 的配合使用方法。
在主线程中,可以创建 HandlerThread 对象:
HandlerThread mHandlerThread = new HandlerThread("sub_thread");
mHandlerThread.start();
这样,就开启了一个子线程,该线程的名字就是 sub_thread.
然后,我们实现一个继承自 Handler 的 MyHandler 类:
class MyHandler extends Handler {
public MyHandler() {
super();
}
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
if(msg.what == MSG_WHAT) {
Bundle bundle = msg.getData();
String info = bundle.getString("main");
Log.d("mark", "我接受任务:" + info);
}
}
}
最后,使用 Message 来传递消息,MyHandler 会根据情况处理 Message.
完整代码:
package mark.zhang;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class HandlerThreadActivity extends Activity {
private static final int MSG_WHAT = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建对象,并启动该线程
HandlerThread mHandlerThread = new HandlerThread("sub_thread");
mHandlerThread.start();
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
// 创建 Bundle 对象,传递数据
Bundle bundle = new Bundle();
bundle.putString("main", "我这边事情太多,麻烦你帮忙处理一下!");
// 发送消息
Message msg = new Message();
msg.what = MSG_WHAT;
msg.setData(bundle);
msg.setTarget(mHandler);
msg.sendToTarget();
Log.d("mark", "UI----" + "threadName: " + Thread.currentThread().getName() + ",threadId: " + Thread.currentThread().getId());
}
/**
* 该Handler调用 handleMessage方法运行在子线程
*
* @author mark
*/
class MyHandler extends Handler {
public MyHandler() {
super();
}
/* 这个构造方法必须有 */
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_WHAT) {
Bundle bundle = msg.getData();
// 接收消息
String info = bundle.getString("main");
Log.d("mark", "handleMessage---" + "threadName: " + Thread.currentThread().getName() + ",threadId: " + Thread.currentThread().getId());
Log.d("mark", "我接受任务:" + info);
}
}
}
}
这里,我们思考一个问题,代码:
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
获取 Looper 对象,使用的是 HandlerThread 对象的 getLooper 对象。为什么不直接这样:
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(getMainLooper());
如果这样做的话,打印信息如下:
D/mark (21852): UI----threadName: main,threadId: 1
D/mark (21852): handleMessage---threadName: main,threadId: 1
D/mark (21852): 我接受任务:我这边事情太多,麻烦你帮忙处理一下!
可见,此时的 handleMessage 是在主线程中运行的。每个主线程默认有一个 Looper,也就是说在主线程中,下面代码是等效的:
MyHandler mHandler = new MyHandler(getMainLooper());
MyHandler mHandler = new MyHandler();
但是子线程需要手动获取如:
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
实现主线程、子线程双向通信可以在各自的线程中分别是用 Handler 来传递信息和处理消息。
分类: Android 2012-01-02 10:48 4772人阅读 评论(18) 收藏 举报
在 android 中,不可以在子线程中更新 UI 的操作,否则会报错或者异常信息。
在这种情况下,我们会使用 Handler(在 UI 线程创建该对象) 接收子线程的消息更新 UI.
可以看出,这是子线程通知主线程,而主线程没有直接通知子线程,那麽我们如何做到这一点?这样有什么好处?
好处,很明显。主线程中如果有些耗时的操作,我们可以让子线程去做,这时,主线程就可以通知子线程了!
实现这种操作的方式有很多,今天主要想说说 HandlerThread 与 Handler 的配合使用方法。
在主线程中,可以创建 HandlerThread 对象:
HandlerThread mHandlerThread = new HandlerThread("sub_thread");
mHandlerThread.start();
这样,就开启了一个子线程,该线程的名字就是 sub_thread.
然后,我们实现一个继承自 Handler 的 MyHandler 类:
class MyHandler extends Handler {
public MyHandler() {
super();
}
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
if(msg.what == MSG_WHAT) {
Bundle bundle = msg.getData();
String info = bundle.getString("main");
Log.d("mark", "我接受任务:" + info);
}
}
}
最后,使用 Message 来传递消息,MyHandler 会根据情况处理 Message.
完整代码:
package mark.zhang;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class HandlerThreadActivity extends Activity {
private static final int MSG_WHAT = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建对象,并启动该线程
HandlerThread mHandlerThread = new HandlerThread("sub_thread");
mHandlerThread.start();
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
// 创建 Bundle 对象,传递数据
Bundle bundle = new Bundle();
bundle.putString("main", "我这边事情太多,麻烦你帮忙处理一下!");
// 发送消息
Message msg = new Message();
msg.what = MSG_WHAT;
msg.setData(bundle);
msg.setTarget(mHandler);
msg.sendToTarget();
Log.d("mark", "UI----" + "threadName: " + Thread.currentThread().getName() + ",threadId: " + Thread.currentThread().getId());
}
/**
* 该Handler调用 handleMessage方法运行在子线程
*
* @author mark
*/
class MyHandler extends Handler {
public MyHandler() {
super();
}
/* 这个构造方法必须有 */
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_WHAT) {
Bundle bundle = msg.getData();
// 接收消息
String info = bundle.getString("main");
Log.d("mark", "handleMessage---" + "threadName: " + Thread.currentThread().getName() + ",threadId: " + Thread.currentThread().getId());
Log.d("mark", "我接受任务:" + info);
}
}
}
}
这里,我们思考一个问题,代码:
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
获取 Looper 对象,使用的是 HandlerThread 对象的 getLooper 对象。为什么不直接这样:
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(getMainLooper());
如果这样做的话,打印信息如下:
D/mark (21852): UI----threadName: main,threadId: 1
D/mark (21852): handleMessage---threadName: main,threadId: 1
D/mark (21852): 我接受任务:我这边事情太多,麻烦你帮忙处理一下!
可见,此时的 handleMessage 是在主线程中运行的。每个主线程默认有一个 Looper,也就是说在主线程中,下面代码是等效的:
MyHandler mHandler = new MyHandler(getMainLooper());
MyHandler mHandler = new MyHandler();
但是子线程需要手动获取如:
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
实现主线程、子线程双向通信可以在各自的线程中分别是用 Handler 来传递信息和处理消息。
发表评论
-
怎样成为一名Android开发者
2012-04-14 21:49 1192导读:从事Android开发给我带来的收入甚至远没有达到iPh ... -
Android基础概念
2012-04-14 15:21 894Android操作系统 Android是一个基于Linux ... -
一个帖子掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体 [复制链接]
2012-03-29 20:31 1618文章链接:http://www.apkbus. ... -
分享45个android实例源码,很好很强大.收藏吧!!!
2012-03-29 20:23 1050文章链接:http://blog.sina.com.cn/s/ ... -
android开发文章
2012-03-26 13:03 1020推荐momo雨松的一些列android开发文章,其中涉及很多游 ... -
如何选好Android开发书籍和教程[总结]
2012-03-24 23:18 2263本文汇总整理了时下关 ... -
安卓巴士Android开发神贴整理
2012-03-24 23:17 87210个经典的Android开源应用项目 http://www. ... -
Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程
2012-03-23 09:40 984文章链接:http://www.apkbus.com/andr ... -
xx项目交互数据流程
2012-03-13 23:49 962xx项目交互数据流程 UI触发事件,发送广播到业务逻辑处理 ... -
有关Android线程的学习
2012-03-12 11:33 910有关Android线程的学习 20 ... -
安卓巴士精选Android开发教程
2012-03-09 20:55 1150自从我实习以后的一点感受:写得非常棒,对于应届毕业生,正在念书 ... -
android帖子
2012-03-08 19:37 1045一个demo让你掌握Android的各种Service: ht ... -
多线程断点上传下载类
2012-03-04 20:54 1290public class MulThreadDownload ... -
详解Android源码的编译
2012-02-27 21:21 1091详解Android源码的编译 ... -
Intent在Android中的几种用法
2012-02-26 18:34 1106如果是从BroadcastReceiver ... -
获取网络图片工具类
2012-02-26 18:33 1176package com.soarsky.util; impo ... -
Android 写出高质量的代码
2012-02-20 09:31 1115导读:相信大家都看过google的源码吧,每次看完我都感叹为什 ... -
你了解Activity多少?
2012-02-20 09:30 883一 Activity的生命周期 ... -
Android高手应该精通哪些内容?
2012-02-16 16:17 841很多Android开发者已经度过了初级、中级,如何成为一个An ... -
70道经典Android题加答案--重要知识点几乎都涉及到了
2012-02-13 14:11 141570道经典Android题加答案--重要知识点几乎都涉及到了 ...
相关推荐
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个...
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
测试Android主线程、子线程(thread、handlerThread、AsyncTask、timer)及线程间通信方式(handler、timetask、Runnable)的建立及工作过程
这是我自己写的demo,练习在android中主线程给子线程发送消息
可以在子线程直接new一个Handler,不过需要在子线程里先调用Looper.prepare(),new一个Handler后,还需要调用Looper.loop()方法。 new Thread(new Runnable() { @Override public void run() { Looper.prepare()...
从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os....
Android-TestCallBack接口回调 主线程调用子线程的方法 HttpClient Handler出错:开始时,在AndroidManifest.xml中,启动的activity写错.然后,出现,网址的字符出错,参数不合法.还没有解决.
实现的应用为一加法器,在thread中时行计算,主线程通过handler传递参数给thread,theread处理完后再通过handler传回主线程。如果只是实现加法器,没有必要整个线程和handler,主要的目的在于数据在不同线程通过...
处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送...
经过探索,我发现可以实现一个主线程给多个线程发送消息,主线程接收每个线程的内容进行处理 下面是我改造的例子:
handler的使用演示,主线程给子线程发消息,子线程给主线程发消息
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关...所以主线程通常又被叫做UI线程。
android 中的五中子线程和主线程交互方式,可针对整个activity的UI或者单个View
例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程...
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android为了降低这个开发难度 提供了AsyncTask AsyncTask就是一个封装过的...
在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于...
Handler一、什么是Handler二、为什么需要Handle三、...Handler不仅可以完成主线程与子线程之间的通信,也可以做到子线程与子线程之间的通信。 二、为什么需要Handle 因为子线程是不能进行UI的更新,只有UI线程(即主线