1 Star 1 Fork 0

Seale / AndroidThread

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
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<Void,Integer,Boolean> {

    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. 希望大家能够进行交换意见及讨论

空文件

简介

安卓线程操作Handler等 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/Seale6/AndroidThread.git
git@gitee.com:Seale6/AndroidThread.git
Seale6
AndroidThread
AndroidThread
master

搜索帮助