当前位置:操作系统 > 安卓/Android >>

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来处里。

 

www.zzzyk.com

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带来的麻烦(匿名线程开销大,如果每个任务都要创建一个线程,那效率就上不来了。匿名线程难以管理)。

 

摘自 yuxlong2010的专栏

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,