• android UI线程和非UI线程


    转载:http://www.cnblogs.com/mengdd/p/3418780.html

    其他资料,线程使用跟新UI的一些方法

    http://www.cnblogs.com/playing/archive/2011/03/24/1993583.html

    主线程/UI线程:

    应用启动,系统会创建一个主线程(main thread)。

    这个主线程负责向UI组件分发事件(包括绘制事件),应用和android 的UI组件(android UI toolkit)发生交互也是在这个主线程里面。

    所以主线程(main thread)也叫UI线程(UI thread)。

    系统不会为每个组件单独创建线程,在同一个进程里的UI组件都会在UI线程里实例化,系统对每一个组件的调用都从UI线程分发出去。

    结果就是,响应系统回调的方法(比如响应动作的onKeyDown()和各种生命周期回调)永远都是在UI线程里运行。

    当App做一些比较重(intensive)的工作的时候,除非你合理地实现,否则单线程模型的performance会很poor。

      特别的是,如果所有的工作都在UI线程,做一些比较耗时的工作比如访问网络或者数据库查询,都会阻塞UI线程导致事件停止分发(包括绘制事件)。对于用户来说,应用看起来像是卡住了,更坏的情况是,如果UI线程blocked的时间太长(大约超过5秒),用户就会看到ANRapplication not responding)的对话框。

      另外,Andoid UI toolkit并不是线程安全的,所以你不能从非UI线程来操纵UI组件。你必须把所有的UI操作放在UI线程里,

    所以Android的单线程模型有两条原则:

      1.不要阻塞UI线程。

      2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)。

    工作线程:

    根据单线程模型的两条原则,首先,要保证应用的响应性,不能阻塞UI线程,所以当你的操作不是即时的那种(not instantaneous),你应该把他们放进单另的线程中(叫做background或者叫worker线程)。

    比如点击按钮后,下载一个图片然后在ImageView中展示:

    public void onClick(View v) {
        new Thread(new Runnable() {
            public void run() {
                Bitmap b = loadImageFromNetwork("http://example.com/image.png");
                mImageView.setImageBitmap(b);
            }
        }).start();
    }

    这段代码用新的线程来处理网络操作,但是它违反了第二条原则:

      Do not access the Android UI toolkit from outside the UI thread.

      从非UI线程访问UI组件会导致未定义和不能预料的行为。(线程不安全)

    为了解决这个问题,Android提供了一些方法,从其他线程访问UI线程:

    比如,上面这段代码可以这么改:

    public void onClick(View v) {
        new Thread(new Runnable() {
            public void run() {
                final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
                mImageView.post(new Runnable() {
                    public void run() {
                        mImageView.setImageBitmap(bitmap);
                    }
                });
            }
        }).start();
    }

    这么改之后就是线程安全的了。

      但是,当操作变得复杂的时候,这种代码会变得非常复杂,为了处理非UI线程和UI线程之间更加复杂的交互,可以考虑在worker线程中使用一个Handler,来处理UI线程中传来的消息。

      也可以继承这个类AsyncTask 。

  • 相关阅读:
    【数据结构】并查集
    项目管理【12】 | 项目范围管理-收集需求
    项目管理【11】 | 项目范围管理-规划范围管理
    项目管理【10】 | 项目范围管理-范围管理概述
    Visual Studio代码远程调试方法
    项目管理【09】 | 项目整体管理-结束项目或阶段
    操作系统【2】Linux系统安装
    操作系统【1】Linux基础知识
    移动端开发案例【2】头部组件开发
    移动端开发案例【1】全局样式配置
  • 原文地址:https://www.cnblogs.com/asijack/p/4326143.html
Copyright © 2020-2023  润新知