Android消息机制入门一

为什么要引入消息机制?

为什么要引入消息机制,首先举一个简单的例子,我们来说明:

package cn.edu.heut.zcl; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle;  public class Activity1 extends Activity {        private int t = 0;          public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);         setContentView(R.layout.main);         Timer timer = new Timer();         timer.scheduleAtFixedRate(new MyTask(), 1, 5000);     }     private class MyTask extends TimerTask{         @Override         public void run() {               Activity1.this.updateTitle();        }        }     public void updateTitle(){                  setTitle("title:" + t);         t ++;     } }

我相信,看完代码之后,稍微有编程经验的朋友都会明白,这段代码是每隔一段时间该改变应用程序的标题的。但是你可以运行一下试试,他是绝对不会有任何反应的,这是为什么呢?

主线程与子线程

原来,在Android应用程序启动的时候,就会启动一个主线程(即UI线程)。但有时需要进行一些耗时运算,如果这些运算都放在主线程中,那么我们知道主线程就会阻塞,这样将会造成不好的用户响应。

这时一般采取的策略就是开辟一个新的线程,但是如果在新的线程里面写了处理主线程的代码,那么就会出现上面的例子的情况,什么都不会发生,甚至报错。

其实原因很简单,在设计Android时处于安全考虑,子线程是无法修改主线程的显示的代码的。这是问题接踵而来,怎么在子线程中修改主线程的显示呢?这是应该使用Android提供的消息机制。在这里我先给出一个简单的例子,该例子是我看到一位牛人写的之后进行修改,更适合本文,代码如下:

package cn.edu.heut.zcl; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle; import android.os.Message;  import android.os.Handler;  public class Activity1 extends Activity {         private int t = 0;          private Handler mHandler = new Handler(){                    @Override                   public void handleMessage(Message msg) {                            super.handleMessage(msg);                            switch(msg.what){                            case 1:                                     updateTitle();                                     break;                            }                   }    };    public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);                 Timer timer = new Timer();         timer.scheduleAtFixedRate(new MyTask(), 1, 5000);     }     private class MyTask extends TimerTask{         @Override         public void run() { //              Activity1.this.updateTitle();            Message message = new Message();             message.what = 1;             mHandler.sendMessage(message);         }        }     public void updateTitle(){                  setTitle("title:" + t);         t ++;     } }

该例子是对上一个例子的修改,在主线程中声明了Handler对象,该对象用来接收并且处理收到的handlerMessage消息。在子线程中声明一个Message对象,并且为这个Message对象附上信息。通过Handler来发送消息。当主线程的接收消息收到信息后,进行处理,这就相当于在主线程中处理了。也就完成了子线程对主线程的改变。

更多相关文章

  1. Android(安卓)- 多线程 - AsyncTask
  2. Android(安卓)开发学习 HelloAndroid例子
  3. Android解析WindowManagerService(一)WMS的诞生
  4. Android应用程序的Java数据更新和UI同步改变
  5. RxJava1的使用介绍
  6. Thread
  7. Android更新UI的方法
  8. Android(安卓)任务、进程和线程
  9. Android:线程使用来更新UI--Thread、Handler、Looper、TimerTask

随机推荐

  1. android之theme为dialog的activity全屏问
  2. android 获取video列表和缩略图 亲测()
  3. Android(安卓)WebView使用基础
  4. MMI Code Messages on Android
  5. android中经常用到的 ExpandableListView
  6. PhoneGap 搭建Android应用环境
  7. Android(安卓)AlertDialog.Builder 取消(
  8. Ubuntu 10.10 64bit下使用Android(安卓)N
  9. Android与服务器通信——http方式通信
  10. Android(安卓)自定义View 慢慢画一个不同