day4.16总结_消息通讯
一、Android 中的消息通讯
(1)Android 中线程的应用机制
1)Android 中所有的耗时操作应在工作线程执行。
2)Android 中所有的UI操作应该在主线程(UI线程)执行。
1)主线程执行执行耗时操作好吗? 不好,这样会阻塞UI操作。
2)工作执行完耗时操作,假如有数据要传递给主线程,那如何实现?
例子1:有数据要传递给主线程
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } String LOCK="LOCK"; String str; public void onClick(View v){ new Thread(){ @Override public void run() { synchronized (MainActivity.this) {局部函数需加上MainActivity //模拟耗时下载 try{sleep(3000);} catch(Exception e){} str="下载完成"; MainActivity.this.notifyAll(); System.out.println("下载完成"); } //更新标题(UI更新) //setTitle(str);(UI更新应在主线程执行) } }.start(); synchronized (this) { if(str==null) try{this.wait();}让主线程等待 catch (Exception e) {} } setTitle(str); } } |
例子2:内部类单例
classSingleton03{//单例改进 privateSingleton03() {} staticclassInnerSingle{ staticSingleton03 instance= newSingleton03(); } publicstaticSingleton03 getInstance(){ returnInnerSingle.instance; } //static void show(){} //public void display(){} } |
2.Android 中多线程应用时的消息模型?
使用Android中消息模型的目的是尽量不要去阻塞
主线程,然后给用户一种比较友好的体验。
public class MainActivity extends Activity { private Handler mHandler; /**onCreate方法运行在主线程*/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //构建一个Handler,关联主线程的Looper //主线程在启动时会创建一个Looper,并关联一个消息对象 //mHandler=new Handler(){//默认关联当前线程looper //当handler关联的looper所在线程收到消息以后会回调此方法 //在此方法中可以执行消息的处理操作 //此方法运行在哪个线程取决于handler关联的looper //一个线程最多有一个Looper对象 mHandler=new Handler(Looper.getMainLooper()){ public void handleMessage(Message msg) { if(msg.what==1){//what表示做什么 isExit=false; return; } setTitle((String)msg.obj); }; }; } public void onClick01(View v){ new Thread(){ @Override public void run() { try{sleep(5000);}catch(Exception e){} //下载完成 String s="helloworld01";//(从网络获得的数据) //将如上数据交给主线程 //1.构建消息对象 Message msg=new Message(); msg.obj=s; //2.将消息对象发送给主线程 //记住:消息发送给谁,取决于handler关联的looper mHandler.sendMessage(msg); } }.start(); } public void onClick02(View v){ new Thread(){ @Override public void run() { try{sleep(3000);}catch(Exception e){} //下载完成 String s="helloworld02";//(从网络获得的数据) //将如上数据交给主线程 //1.构建消息对象 Message msg=new Message(); msg.obj=s; //2.将消息对象发送给主线程 //记住:消息发送给谁,取决于handler关联的looper mHandler.sendMessage(msg); } }.start(); } boolean isExit; /**点击回退操作时执行此方法*/ @Override public void onBackPressed() {点击返回键 点击两次就关闭的效果 if(!isExit){ Toast.makeText(this, "再点一次则退出",1).show(); isExit=true; /*new Thread(){ public void run() { try{sleep(5000);}catch(Exception e){} isExit=false;以往线程实现 }; }.start();*/ /*new Handler(Looper.getMainLooper()){ public void handleMessage(Message msg) { isExit=false; }; }.sendEmptyMessageDelayed(1, 3000);*/ mHandler.sendEmptyMessageDelayed(1,3000);Handler实现 (what,时间) }else{ finish(); } } } |
Android 中消息模型关注对象:
1)Message :数据的载体
2)MessageQueue: 存储多个消息对象
3)Looper:迭代消息队列,取出消息。
4)Handler:发送,处理消息队列中的消息。
3.Android 中消息模型应用案例?
1)工作线程发消息给主线程?
2)主线程发消息给主线程?
3)主线程发消息给工作线程?
记住:
1)主线程在启动时已经默认创建了Looper和消息队列对象
2)给谁发消息就让handler关联谁的Looper.
3)handler的handleMessage方法运行在哪个线程由handler
关联的looper而定。
更多相关文章
- Android 高性能编码一:多线程并发或分布式提高TPS
- Android异步消息处理机制详解及源码分析
- Android Asynchronous Http Client - 开源http 多线程引擎
- Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载
- Android Handler消息机制源码分析——第一部分:Looper与MessageQ