zoukankan      html  css  js  c++  java
  • android开发之多线程实现方法概述

    一、单线程模型

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

    在开发Android 应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

    如果在非UI线程中直接操作UI线程,会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views,这与普通的java程序不同。

    由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序。

    如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信。

    Message Queue:

    Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一次启动程序时会默认会为UI thread创建一个关联的消息队列,可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast receivers 等等。你可以在自己的子线程中创建Handler与UI thread通讯。 

    通过Handler你可以发布或者处理一个消息或者是一个Runnable的实例。每个Handler都会与唯一的一个线程以及该线程的消息队列管理。

    Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。

    (以上转自http://www.cnblogs.com/nio-nio/archive/2012/07/23/2604900.html)

    二、多线程的实现

    有以下几种方式:  

    1)Activity.runOnUiThread(Runnable)  

    2)View.post(Runnable) ;View.postDelay(Runnable , long)  

    3)Handler  

    4)AsyncTask  

    Android是单线程模型,这意味着Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,所以你单纯的new一个Thread并且start()是不行的,因为这违背了Android的单线程模型。那么如何用好多线程呢?总结一下:  
    事件处理的原则:所有可能耗时的操作都放到其他线程去处理。 

     对于第一种方法:

    activity.runOnUiThread(new Runnable() {               
                @Override 
                public void run() {  
                    // TODO Auto-generated method stub  
                	int i = 30;
                	textView.setText(""+i+" s");
                	}
                }  
            });  

    第2,3种方法网络上资料较多,不再赘述。第4种方法在上一篇博文中已经介绍。

    三、总结:

    1)android系统是单线程系统,为了实现多线程的效果,采用了message queue。

    2)为实现多线程,可采用runOnUiThread,post,handle,AsyncTask技术实现。

  • 相关阅读:
    HDUoj(1002)A + B Problem II
    HIT Summer 20180731
    Windows10下python3.5对维基百科语料用word2vec进行训练寻找同义词相似度
    关键词抽取
    win10+python遇到:Using TensorFlow backend.错误
    Windows下Python3.5+numpy+keras+tesorflow的环境配置
    常用的一些序列号
    Umbraco扩展开发
    Umbraco Content属性
    Windows查看端口占用
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3119995.html
Copyright © 2011-2022 走看看