# AndroidThread **Repository Path**: Seale6/AndroidThread ## Basic Information - **Project Name**: AndroidThread - **Description**: 安卓线程操作Handler等 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-11-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AndroidThread 本项目主要实践Android开发中的多线程编程 #### 项目介绍 安卓线程操作Handler\异步任务\异步消息处理机制等等 #### 更新说明 ##### 2018年11月15日 1. 实现Handler对象进行对主线程的UI异步操作处理 #### **关于对Android多线程编程的一些理解** ##### 简介 当我们需要执行一些耗时操作的实收,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如果不将这类操作放在子线程里面去运行,就会导致主线程被阻塞住,从而影响用户对软件的正常使用 在Android开发中,我们通常不会使用继承的方式来实现线程,因为这样耦合性会有点高,更多的时候我们都会选择使用实现Runnable接口的方式来定义一个线程 ``` class MyThread() implements Runnable { @Override public void run(){ //处理具体的逻辑 } } ``` 相应的,启动线程的方式也会有所改变 `MyThread mThread = new MyThread();` `new Thread(mThread).start();` 和许多GUI库一样,Android的UI也是线程不安全的,也就是说,如果想要更新应用程序里面的UI元素,则必须在主线程中进行,否则就会出现异常,在子线程当中更新UI会报出异常,但是有些时候我们必须在子线程里去执行一些耗时操作,然后根据耗时任务的执行结果来更新响应的UI控件,对于这种情况,Android提供了一套异步消息的处理机制,完美解决了再子线程中进行UI操作的问题:Handler异步消息处理机制 ##### 解析异步消息处理机制 Android张异步消息处理主要由四个部分组成:Message\Handler\MessageQueue\Looper ###### 1. Message Message是在线程之间传递的消息,他可以在内部携带少量的信息,用于在不同线程之间交换数据,在本项目中我们使用到了Message的**what**字段,初次之外还可以使用**arg**字段来携带一些整数型数据,使用**obj**最短来携带一个object对象 ###### 2. Handler Handler顾名思义也就是矗立着的意思,他主要是用于发送和处理消息的,发送信息一般是使用Handler的 **sendMessage()** 方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler的 **handleMessage()** 方法当中 ###### 3.MessageQueue MessageQueue是消息队列的意思,亚主要用于存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列当中,等待被处理,**每个线程当中只会存在有一个MessageQueue对象** ###### 4. Looper Looper是每个线程中的MessageQueue的管家,调用Looper的Loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法当中,同样的**每个线程中也只会存在一个Looper对象** #### **对异步任务的一些理解** ``` /** * Created by Seale on 2018.11.15 * Author:Seale * Function: 异步下载任务 **/ public class DownLoadTask extends AsyncTask { private Context context; private TextView textView; //进行函数的构造 public DownLoadTask(Context context, TextView textView) { this.context = context; this.textView = textView; } //这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框 @Override protected void onPreExecute() { Toast.makeText(context,"任务进行下载",Toast.LENGTH_SHORT).show(); } /** * 当任务执行完毕并通过return语句进行返回时,这个方法很快会被调用,返回的数据会作为参数传递到此方法中, * 可以利用返回的数据来进行一些UI操作,比如说提醒任务执行的结果以及关闭一些进度条对话框等 * @param aBoolean */ @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); } /** * 当后台任务中调用了publishProgress(Progress...)方法后,onProgressUpdate(Progress....)方法会很快被调用 * 该方法中携带的参数就是在后台啊任务中传递过来的,在这个方法中可以对UI进行操作, * 利用参数中的数值就可以对界面元素进行相应的更新 * @param values */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } /** *这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务, * 任务一旦完成就可以通过return语句来讲任务的执行结果返回 * 特别注意的是这个方法是不可以进行UI操作的,如果需要更新UI元素 * publishProgress(Progress...)方法来完成 * @param voids */ @Override protected Boolean doInBackground(Void... voids) { return null; } } ``` #### 参与贡献 1. 欢迎FORK并Issues 2. 希望大家能够进行交换意见及讨论