【Android Studio学习】6.线程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
比如下图中,studio有2个进程,火狐有12个进程。
在这里插入图片描述

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程(MultiThreading)是指从软件或者硬件上实现多个线程并发执行的技术。

andriod的多线程
当一个应用第一次启动时,Android会同时启动一个对应的主线程(MainThread),主线程主要负责处理与UI相关的事件(用户的按钮点击事件,用户手势事件以及屏幕绘图事件等),并把相关的事件分发到对应的组件进行处理,所以主线程通常又被叫做UI线程。

在开发Android 应用时必须遵守单线程模型的原则:
不要阻塞UI线程
确保只在UI线程中访问Android Ul工具包如果在非UI线程中直接操作UI控件,会抛出android.view.ViewRoot$CalledFromWrongThreadException的异常,这与普通的java程序不同。

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

Android的UI控件是非线程安全的,在其他线程中操作UI线程的控件将可能发生意外,因此Android对UI控件的操作需要交给UI线程去完成;
如果需要在非UI线程操作UI,Android采用Handler消息机制来处理线程间通信。

Handler消息机制

Message:消息,理解为线程间交流的信息,包含消息ID、消息处理对象和处理的数据等,统一放到Message Queue,最终由Handler处理。
Handler:非UI线程与UI线程通信的接口,消息处理者,专门负责Message的发送和处理:

obtainMessage():获取消息
sendMessage(Message msg):发送消息
handleMessage(Message msg):处理消息

Message Queue: Message Queue消息队列,用来存放通过Handler发布的消息,按照先进先出执行。每个message queue都会有一个对应的Handler。Handler会向message queue通过两种方法发送消息:sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。
Looper: Looper是每条线程里的Message Queue的管家。Android没有全局的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。

如下,进度条不停地走,用TextView显示进度条的百分比。点击测试按钮,出现一个testing的提示,不受到进度条的影响,也不影响进度条。
在这里插入图片描述
在每一步之前,都要声明控件,找到控件。

进度条控件在widgets里面。

首先,点击按钮出现testing。

//按钮的点击活动
button.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View v) {
    
    
        Toast.makeText(getApplicationContext(),"testing",Toast.LENGTH_SHORT).show();
        //参数分别为(获得前面的内容,显示内容,显示时间),注意后面的show方法。
    }
});

用一个新线程来更新进度条
在这里插入图片描述
前面声明部分的信息,使用handler来接收信息。
黄色部分的方法里面的那三行代码,表示接收信息并且以下面的方式显示出来。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51692337/article/details/112760558
今日推荐