- 浏览: 513862 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
Android----Thread+Handler 线程 消息循环( 转载)
近来找了一些关于android
线程间通信的资料,整理学习了一下,并制作了一个简单的例子。
andriod
提供了 Handler
和 Looper
来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler
来传递的。
在 Android
,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper
,这个事android
的新 概念。我们的主线程(UI
线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle
,我们有消息循环,就要往消息循环里
面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle
里面,注意Handle
只是针对那 些有Looper
的线程,不管是UI
线程还是子线程,只要你有Looper
,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI
相关的东西,就不能放在子线程中,因为子线程是不能操作UI
的,只能进行数据、系统等其他非UI
的操作。
在Android
,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper
,这个是android
的新概 念。我们的主线程(UI
线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handler
,我们有消息循环,就要往消息循环里
面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler
里面,注意Handler
只是针对那 些有Looper
的线程,不管是UI
线程还是子线程,只要你有Looper
,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI
相关的东西,就不能放在子线程中,因为子线程是不能操作UI
的,只能进行数据、系统等其他非UI
的操作。
一个Handler
的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler
之前先初始化线程的消息队列。如下面的代码:
Java 代码
- class ChildThread extends Thread {
- public void run() {
- /*
- * 创建 handler 前先初始化Looper.
- */
- Looper.prepare();
- /*
- * 在子线程创建handler ,所以会绑定到子线程的消息队列中
- *
- */
- mChildHandler = new Handler() {
- public void handleMessage(Message msg) {
- /*
- * Do some expensive operations there.
- */
- }
- };
- /*
- * 启动该线程的消息队列
- */
- Looper.loop();
- }
- }
class ChildThread extends Thread {
public void run() {
/*
* 创建 handler 前先初始化Looper.
*/
Looper.prepare();
/*
* 在子线程创建handler ,所以会绑定到子线程的消息队列中
*
*/
mChildHandler = new Handler() {
public void handleMessage(Message msg) {
/*
* Do some expensive operations there.
*/
}
};
/*
* 启动该线程的消息队列
*/
Looper.loop();
}
}
当Handler
收到消息后,就会运行handleMessage(…)
的回调函数,可以在里面做一些耗时的操作。
最后完成了操作要结束子线程时,记得调用quit()
来结束消息循环队列。
mChildHandler.getLooper().quit();
下面是一个线程间通信的小例子:
Java 代码
- /**
- *
- * @author allin.dev
- * http://allin.cnblogs.com
- *
- */
- public class MainThread extends Activity {
- private static final String TAG = "MainThread";
- private Handler mMainHandler, mChildHandler;
- private TextView info;
- private Button msgBtn;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- info = (TextView) findViewById(R.id.info);
- msgBtn = (Button) findViewById(R.id.msgBtn);
- mMainHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Log.i(TAG, "Got an incoming message from the child thread - "
- + (String) msg.obj);
- // 接收子线程的消息
- info.setText((String) msg.obj);
- }
- };
- new ChildThread().start();
- msgBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mChildHandler != null) {
- // 发送消息给子线程
- Message childMsg = mChildHandler.obtainMessage();
- childMsg.obj = mMainHandler.getLooper().getThread().getName() + " says Hello";
- mChildHandler.sendMessage(childMsg);
- Log.i(TAG, "Send a message to the child thread - " + (String)childMsg.obj);
- }
- }
- });
- }
- public void onDestroy() {
- super.onDestroy();
- Log.i(TAG, "Stop looping the child thread's message queue");
- mChildHandler.getLooper().quit();
- }
- class ChildThread extends Thread {
- private static final String CHILD_TAG = "ChildThread";
- public void run() {
- this.setName("ChildThread");
- // 初始化消息循环队列,需要在Handler 创建之前
- Looper.prepare();
- mChildHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Log.i(CHILD_TAG, "Got an incoming message from the main thread - " + (String)msg.obj);
- try {
- // 在子线程中可以做一些耗时的工作
- sleep(100);
- Message toMain = mMainHandler.obtainMessage();
- toMain.obj = "This is " + this.getLooper().getThread().getName() +
- ". Did you send me \"" + (String)msg.obj + "\"?";
- mMainHandler.sendMessage(toMain);
- Log.i(CHILD_TAG, "Send a message to the main thread - " + (String)toMain.obj);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
- Log.i(CHILD_TAG, "Child handler is bound to - "+ mChildHandler.getLooper().getThread().getName());
- // 启动子线程消息循环队列
- Looper.loop();
- }
- }
- }
发表评论
-
onInterceptTouchEvent和onTouchEvent调用时序
2012-02-08 08:44 1049onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 915Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1212Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1572【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1148Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1203android 中使用socket使native和frame ... -
android aidl iBinder理解
2011-06-01 11:51 2064在android中有一个程序员大量使用的操作,就是bindse ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1296Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 898近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1074AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 10381. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 859(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2171Android的Launcher成为系统 ... -
Launcher的启动过程
2011-05-12 19:36 22441. Launcher的启动过程 从网络上 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6560android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2885典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1169转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2482android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 35191.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1483在生成的apk目录下放 signapk.jar platfo ...
相关推荐
为了防止UI线程被阻塞,Android引入了Handler、Looper和Message机制来实现线程间通信,尤其是主线程(UI线程)与工作线程之间的交互。"andriod多线程通信handler方法"这个主题正是关注这一核心概念。 首先,我们...
andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 在Android,这里的线程分为有...
在Android开发中,`Handler`是一个至关重要的组件,主要用于解决线程间的通信问题,尤其是在UI线程和其他工作线程之间。本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和...
如果DownloadManager无法满足需求,开发者可以自定义Service来实现多线程下载。通常会创建一个ThreadPoolExecutor,配置合适的线程池大小,然后将每个下载任务作为一个Runnable提交到线程池中执行。 5. **多线程...
在实际开发中,还可以考虑使用第三方库如Volley、OkHttp或Retrofit等,它们提供了更方便的网络请求和下载管理功能,可以简化多线程和断点续传的实现。 综合以上知识点,我们可以构建一个功能完善的多线程断点续传...
从Android 2.3(Gingerbread)版本开始,为了更好地管理和优化系统资源,特别是考虑到多线程和网络操作的复杂性,Google引入了一些重要的变化,以确保Socket连接的正确性和效率。这些变化主要涉及线程管理和权限控制...
在Android系统中,消息机制是实现线程间通信的关键组件,尤其对于UI线程与后台线程之间的交互至关重要。这个机制主要包括Handler、Message、Looper和MessageQueue四个核心组件。接下来,我们将深入探讨这些组件以及...
在实际开发中,我们可以使用Android提供的DownloadManager服务,它已经内置了多线程和断点续传功能,但若需要自定义更复杂的逻辑,如限制并发线程数、动态调整下载速度等,就需要自己实现多线程断点下载逻辑。...
- Handler/Looper/Message:Android消息传递机制,用于在不同线程间通信。 - AsyncTask:Android提供的轻量级异步任务类,简化了在主线程和工作线程间的操作。 3. **Android源码中的异步加载图片**: - `...
Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { //放在UI线程弹Toast Toast.makeText(Setting.this, 正在更新请稍后, Toast.LENGTH_...
Android提供了Handler、Looper和Runnable等机制来实现线程间的通信。 游戏中的动画效果也是关键部分。Android提供了多种方式实现动画,如Tween动画、帧动画以及属性动画。通过这些,你可以让角色动起来,或者实现...
使用Handler、Looper和Runnable等机制来实现线程间的通信和任务调度。 6. **权限管理**:播放本地或网络上的媒体文件可能需要请求相应的权限,例如READ_EXTERNAL_STORAGE用于读取外部存储中的媒体文件,INTERNET...
10. **多线程与异步处理**:AsyncTask、Handler、Looper、ThreadPoolExecutor等异步处理机制,理解主线程与子线程的交互。 11. **网络编程**:HTTP请求库的使用,如OkHttp、Retrofit,以及如何处理JSON数据。 12. ...
6. **事件驱动编程**:使用Android的Handler和Looper机制,或者现代的RxJava库,可以有效地处理异步数据流,确保UI线程不被阻塞。 7. **异常处理**:考虑到无线通信的不稳定性和硬件故障,需要在代码中添加适当的...
同时,理解并运用Android的异步机制,如Handler、Looper和Runnable,以避免阻塞主线程。 网络编程在许多应用中占据重要地位。学习使用HttpURLConnection、OkHttp或者Volley库进行网络请求,理解JSON解析,并能处理...
- 13141516.rar可能讲解了Android中的线程管理,如Handler、Looper和AsyncTask,以及如何避免UI线程阻塞。 6. **数据存储** - Android提供了多种数据存储方式,包括SharedPreferences、SQLite数据库、...
7. **线程管理**:由于串口通信通常是异步的,因此在Android应用中,我们需要考虑线程安全问题,通常使用Handler、Looper或AsyncTask等机制来处理串口事件。 8. **异常处理**:串口通信可能会遇到各种异常,如设备...
在Android开发中,实现轮播图效果是一种常见的需求...总之,Android中实现多线程轮播图的关键在于合理利用子线程进行耗时操作,并通过`Handler`与主线程通信。同时,注意性能优化和用户体验,确保图片加载快速且流畅。
Android提供了Handler、Looper和ThreadPool等机制来处理多线程。通常,我们会创建一个后台线程专门负责下载,主线程则负责播放控制。 4. **缓冲区管理:**为了保证流畅播放,需要在内存中设立缓冲区。当下载的数据...