Android是基于Java的,所以也分主线程,子线程!
主线程:实现业务逻辑、UI绘制更新、各子线程串连,类似于将军;
子线程:完成耗时(联网取数据、SD卡数据加载、后台长时间运行)操作,类似于小兵;
一、子线程向主线程发消息(Thread+handler):
1、主线程中定义Handler:
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//do something,refresh UI;
break;
default:
break;
}
}
};
2、子线程处理完耗时操作之后发消息给主线程,更新UI:
mHandler.sendEmptyMessage(0);
这样在子线程与主线程任务分工的条件下完成了消息交互;
二、主线程向子线程发送消息(Thread+handler):
主线程碰到耗时操作要子线程完成,此时发通知给子线程,操作步骤如下:
1、子线程中定义Handler,Handler定义在哪个线程中,就跟那个线程绑定,在线程中绑定Handler需要调用Looper.prepare();方法,主线程中不调用是因为主线程默认帮你调用了;
public class LoopThread implements Runnable {
public Handler mHandler = null;
@Override
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
String result = NetUtil.getJsonContent("北京");
//完成了获取北京天气的操作;
Log.i("test", "handler"+result);
}
};
Looper.loop();
}
}
其中Looper.prepare();和Looper.loop();维护了一个消息队列,等待消息注入并在子线程中执行;
2、主线程中这样调用:
lThread.mHandler.sendEmptyMessage(0);
主线程向子线程发消息,让子线程执行指定的操作,在Android中还有一种方法,即:HandlerThread,看下面的例子:
HandlerThread handlerThread = new HandlerThread("jerome");
handlerThread.start();
/**
* 这里要将HandlerThread创建的looper传递给threadHandler,即完成绑定;
*/
threadHandler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//这儿可以做耗时的操作;
Log.i("jerome", "hello,I am sub thread");
break;
default:
break;
}
}
};
分享到:
相关推荐
测试Android主线程、子线程(thread、handlerThread、AsyncTask、timer)及线程间通信方式(handler、timetask、Runnable)的建立及工作过程
Android中两个子线程的通信demo
主线程和子线程和HandlerThread 子线程间的通信
这是我自己写的demo,练习在android中主线程给子线程发送消息
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
子线程更新主线程数据(再谈多线程)
Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个...
java 子线程通过观察者模式通知主线程
Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码...
android Handler子线程计算斐波那契数列
本资源详细介绍了主线程和子线程之间的通信过程,通过实例讲解了参数如何传递
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面。
C#子线程刷新主线程示例源码 功能介绍: 使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现结果 技术特点: 使用了多线程实现了子线程刷新主线程 ,使用委托刷新主线程。 注意: 开发环境为...
3分也不高,主要是码不错,解决了android4.0以后socket无法在主线程中实现网络连接,当然暴力的方法也有,既存在即合理,暴力方法在主线程中网络连接会导致很多问题,很适合初学者来看的代码,带注释;
主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 线程唯一标示符:Thread.CurrentThread.ManagedThreadID; UI界面和Main函数均为主线程。 被Thread包含的“方法体”或者“委托...
c#子线程如何读取及设置主线程ui的值,自己录的一个小视频,方便理解,比较菜鸟的方法,请勿喷!
C# Winfrom必须掌握的技术,主线程显示数据,子线程获取数据,这是我做项目实际用到的技术。
Unity除了一些基本的数据类型,几乎所有的API都不能在子线程中调用,如果项目中有一段很耗时操作,unity可能会出现“卡死...因此针对这个问题再加上查找了一些资料,弄出了一个小工具,可以子线程与主线程的相互访问。
子线程任务发生异常,主线程事务如何回滚
下面小编就为大家带来一篇C#子线程执行完后通知主线程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧