android中的进程与线程的理解

一个android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全。

一个应用对应一个主线程,就是通常所说的UI线程,android遵守的就是单线程模型,所以说Ui操作不是线程安全的。CalledFromWrongThreadException通常就是在非主线程中刷新UI引起的。

在单线程的模型下,一些耗时的操作就要交给其它子线程去执行。于是就有了Message Queue(消息队列),辅助线程间进行通信。每个线程都可以有自己的Message Queue,特别的是主线程中的消息对列是系统生成的,每个MessageQueue都会有一个对应的handler,其它子线程中要想有自己的消息队列必须手动生成。管理消息队列的是Looper,每个进程都有自己的Looper。子线程中Message Queue 的生成必须依赖于Looper,Looper一旦开始loop后,它就会一直监控着消息队列,对send进来的Message进行处理。先进先出。一旦处理完一条Message,那么该Message马上就会被置为null。当传送过来很多的消息时,不知道交给哪个线程执行时,可以判断当前这个传送消息过来的handler里面的Looper对象是属于哪个线程的,属于哪个线程就在哪个线程里执行。

1,一个Handler可以通过它的构造函数来个它设置looper.

                Handler handler = new Handler(getMainLooper());

2,在子线程中handler通过sendMessage将消息传到拥有当前Handler对象的那个线程中,利用hadlerMessage来处里。

Handler handerHandler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            switch (msg.what) {

            case 0:

                case 1: 

                    break;

        }

            super.handleMessage(msg);

        }

    };

 

3,Handler向MessageQueue发送消息除了sendMessage之外还有post也可以,它发的是一个unnable会自动执行。

  handler.post(new Runnable()
        {
            @Override
            public void run()
            {
              
                
            }
        });

4,在子线程中创建自己的消息队列,并监控次消息队列。

Class A implements Runnable{

Handelr handler;

  public void run() {

Looper.prepare();

handler = new Handler(){

public void handleMessage(Message msg) { 

}

             }

Looper.loop();

}

}

java.util.concurrent 框架中给我们提供了另外一个工具 AsyncTask,它的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦(匿名线程开销大,如果每个任务都要创建一个线程,那效率就上不来了。匿名线程难以管理)。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值