导图社区 安卓Android消息机制handler进程与线程知识点笔记
安卓Android消息机制handler进程与线程知识点笔记、进程与线程、资源分配的基本单位、表格、内存空间、磁盘空间、I/O设备、调度运行程序 的基本单位、分配CPU以及其它有关资源。
网店详情页排版方法分享~包括中心页面组成,优质详情必备,详情页的排版参考方法。感兴趣的小伙伴可以看看哦~
喷绘色彩基础培训方案,内容涵盖色彩基础,喷绘写真。框架清晰,内容丰富,希望对小伙伴有所帮助哦~
酒窖营销计划方案,包括结果目标,过程目标。框架清晰,内容丰富,有需要的小伙伴可以看看哦~ 可供大家参考,借鉴,交流。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
安卓Android消息机制handler进程与线程知识点笔记
进程与线程
进程
资源分配的基本单位
表格、内存空间、磁盘空间、I/O设备
调度运行程序 的基本单位
分配CPU以及其它有关资源
线程
进程中执行运算的最小单位
单进程多线程
子任务
好处
1)易于调度
2)提高并发性
开销少
进程和线程的关系
1:n
一个进程可以有多个线程
一个线程只能属于一个进程
资源
资源分配给进程
同一进程的所有线程共享该进程的所有资源
同步
线程间要利用消息通信
进程间
android:process属性
为任意组件包括应用指定进程
:私有新的专属
以小写字符开头
全局共享的进程
权限
优先级
前台进程(Foreground process)
:用来处理用户正在进行的工作的进程
可见进程( Visible process)
:不包含任何前台组件,但包含仍然被用户可见的组件
服务进程(Service process)
:其中运行着使用startService()方法启动的Service,并且没有变为更高的两个级别的进程。
后台进程(Background process)
:处理后台事务的进程,比如其中运行着执行了onStop()方法而处于停止态的Activity等。
空进程(Empty process)
:不包含任何活动的应用程序组件的进程。
线程矛盾
主线程UI2规则
两条规则
不要阻塞UI线程
否则超过5s有出现ANR
SystemClock.sleep(10000);
Application Not Responding
不要在非UI线程中更新UI
直接报错
Thread(new runnable{
void run() {
textView_info.setText("你好");
解决方式
其它线程尝试访问UI线程并委托UI线程更新UI
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
进程通信
其它线程给UI线程发送消息,UI线程根据消息更新UI
AsyncTask类
onPreExecute()
doInBackgound()
onProgressUpdate
onPostExecute()
AsyncTaskLoader
onStartLoading - loadInbackground---onStopLoading - --deliverResult()
消息机制
消息角色
Message
携带数据的容器对象
Handler
发送、接收Message的处理工具
Looper
管理特定线程内对象之间的消息交换
1线程1个,主线程自动创建
Message Queue
用来存放线程放入的消息。
如何使用消息携带数据
属性
arg1,arg2,简单常用int型
obj
可以指定任意内容对象
what
特殊标志int型
setdata
bundle类型
消耗性能大
msg.arg1/obj=XXX
bundle.putXXX(key,value);
msg.setData(bundle)
Message.obtain(handler,what,arg1,arg2,obj);
msg=Message.obtain(mainHandler, 5, 1, 2, "我是obj对象");
直接指定多个内容
发送
msg.sendToTarget();
和obtain一起用,指定数据
mainHandler.sendMessage(msg);
handler.sendMessageAtTime(msg,SystemClock.uptimeMills);
handler.sendMessageDelayed(msg,2000);
handler.sendEmptyMessage(1)
常用方法
handler
handleMessage()
类自带,取出消息中的内容
sendMessage(msg)
prepare()
1.创建消息泵对象
loop()
开启消息泵
myLooper()
quit()
主线程默认开启
—
子发主收程访问
layout
text
button
main
初始化textview
初始化mainHandler对象
new Handler(){
重写获取数据方法
public void handleMessage(android.os.Message msg) {
获得数据,更新UI
String content = "arg1 ="+arg1+",arg2"+arg2+",what = "+what;
int arg1 = msg.arg1;
int arg2 = msg.arg2;
int what = msg.what;
Object object = msg.obj;
textView_info.setText(content);
自定义点击按钮
sendMessageToMain()
new Thread(new Runnable() {
public void run() {
Message msg =Message.obtain(mainHandler,5,2,3,"我是obj你爹");
}).start();
主发子接
button_sendMessageToMain
button_sendToMessageChild
private Handler childHandler;
sendToMessageChild
Message msg=Message.obtain();
msg.obj="我是主线程发送到子线程的消息";
childHandler.sendMessage(msg);
以继承Thread类的方式实现子线程handler处理数据
private final class MyChildThread extends Thread
Looper.prepare();
childHandler=new Handler(){
* 由于这个方法运行在子线程中,因此不能用来更新UI
public void handleMessage(Message msg) {
//Looper.myLooper():得到当前线程的消息泵对象
childLooper=Looper.myLooper();
Object obj=msg.obj;
System.out.println("obj="+obj);
Looper.loop();
//开启消息泵
启动子线程
MyChildThread myChildThread=new MyChildThread();
myChildThread.start();
protected void onDestroy() {
Looper mainLooper=Looper.getMainLooper();
//得到主线程的消息泵对象
if(childLooper!=null){
childLooper.quit();
//停止消息泵对象
super.onDestroy();
//mainLooper.quit();
//主线程的消息泵不能关闭,否则报异常