android 中的多线程实现方式

AsyncTask:
实现多线程,在工作线程中执行任务,如耗时任务

它属于抽象类
public abstract class AsyncTask {

}

// 类中参数为3种泛型类型
// 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型
// 具体说明:
// a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数
// b. Progress:异步任务执行过程中,返回下载进度值的类型
// c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
// 注:
// a. 使用时并不是所有类型都被使用
// b. 若无被使用,可用java.lang.Void类型代替
// c. 若有不同业务,需额外再写1个AsyncTask的子类
}

核心方法:
execute() :触发 执行异步线程任务 注意:必须在UI线程中调用
onPreExecute() :执行线程任务前的操作 ,此方法系统自动调用,即在执行execute()之前调用,作用用于UI组件的初始化,如进度条的对话框
onInBackground() :接收输入参数,执行任务中的耗时操作,必须重写,返回线程任务执行的结果
此方法内不能更改UI组件的信息,执行过程中可调用publishihProgress()更新进度信息,自动调用,在执行onPreExecute() 方法执行完成之后自动

onProgressUpdate() : 在主线程,显示线程任务执行速度,根据需求写,不能手动调用,在调用publishProgress()时自动调用

onPostExecute() :接收线程任务执行结果,将执行结果显示到UI组件上,必须重写
线程任务结束时,自动调用

onCancelled() :将异步任务设置为:取消状态,该方法被调用时,onPostExecute()就不会被调用

注意点:
(1)AsyncTask 不与任何组件绑定生命周期,所以在Activity 或 Fragment中使用AsyncTask 时,最好在Activity 或 Fragment的onDestory() 调用cancel(boolean)
(2)内存泄漏的问题:
若AsyncTask 被声明为Activity的非静态内部类,当Activity需销毁时,会因AsyncTask 保留对Activity的引用而导致Activity无法回收,最终引起内存泄漏,所以 ,AsyncTask 声明为静态内部类
(3)线程执行任务结果丢失:
当Activity被重新创建时(屏幕旋转/Activity被意外销毁时恢复),之前运行的AsyncTask(非静态的内部类)持有的之前Activity引用已无效,因此写的onPostExecute() 将不生效,即无法更新UI
所以在Activity恢复时的对应方法,重启任务线程

AsyncTask线程只能运行一次
原理:
AsyncTask 的实现原理 = 线程池 + Handler
其中线程池用于线程调度 ,复用 & 执行任务;handler用于异步通信

实例Demo:

在这里插入代码片

HandlerThread :实现多线程任务,比如耗时任务,异步通信,消息传递
原理:Thread 类 + Handler 类机制

具体使用:
(1)创建HandlerThread 实例对象,构造函数一个参数为线程的名字,作用标记线程
(2)启动线程,mHandlerThread.start();
(3)创建工作线程的Handler ,并重写handlerMessage()
作用:关联HandlerThread的looper对象,实现消息处理操作,通信
Handler workHandler = new Handler(mHandlerThread.getLooper()){
……handlerMessage(){
消息处理
}
}
(4)使用工作线程Handler向工作线程的消息队列发送消息
Message msg = Message.obtain();
msg.what = 2; //消息标识
msg.obj = “B” //消息的存放

workHandler.sendMessage(msg);

(5)结束线程,即停止线程的消息循环
mHandlerThread.quit();

Demo:

在这里插入代码片

你可能感兴趣的:(android,ui,java)