一、Android 中的消息通讯

1Android 中线程的应用机制

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)handlerhandleMessage方法运行在哪个线程由handler

关联的looper而定。

更多相关文章

  1. Android(安卓)异步加载解决方案
  2. Android之消息推送实现
  3. android的Handler
  4. Android(安卓)第七天重置版_BroadCastReceiver
  5. Android(安卓)framework学习
  6. AsyncTask的用法
  7. Android(安卓)高性能编码一:多线程并发或分布式提高TPS
  8. android 多线程
  9. Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载

随机推荐

  1. 修改和制作Android开机Logo(最终版)
  2. Android 各 api 级别与ndk 原生 api对照
  3. Android(安卓)Fragment事件透传
  4. Android Http Get/Post提交请求
  5. Android TableLayout数据列表的回显清空
  6. Android Studio 导入Eclipse建立的androi
  7. 三行代码去Android USB ADB调试确认对话
  8. Android kswapd-->lowmemorykiller启动和
  9. Android平板电脑不能全屏显示的问题
  10. 七、Android数据链接更新路由表