android 启动的,会启动一个线程也称为主线程,UI 线程,但是我们不能把所有耗时的任务交给主线程来完成,这样会影响用户的体验,也就是说我们要另外的开辟新的线程来执行我们的任务,
但是在 android 中,(加载图片,网络编程都属于耗时的操作),在 android4.0 后规定禁止在主线程中完成网络操作,所以说这些耗时的任务要交给子线程,
问题,子线程中是不能进行 ui 操作的,只有作为主线程的 ui 线程才能够进行 ui 操作,那么我们怎么讲信息返回给用户呢.
方式 1. 我们可以通过 handler,在 handler 中写好了跟新的操作,在子线程中调用 sendmessage 通知我们的 handler 跟新 ui
方式 2. 利用 Activity.runonUIThread(Runnable) 进行子线程到 ui 线程的切换.
为什么要是用 AsyncTask?
很简单,人都是很懒的,使用上述的两种方式操作麻烦,所以大佬们就封装了一个异步执行的方法,便于我们直接处理耗时逻辑,更新 UI.
我们一般用它完成网络操作,图片加载,数据传输等操作.(当然后续我们会选择我们的第三方的框架来完成)
Asynctask 的基本使用:
首先它是一个抽象类,也就是说我们要重写他的方法然后在 new
AsyncTask
parames: 启动任务的时候执行的参数,比如传入的 url
Progress:后台执行进度的百分比单位
result:执行完异步操作后返回的结果
(与 handler 相比,他的后台是一个线程池,再数据庞大的时候回体现出优势)
AsyncTask 的几个重要的方法
注意该该方法是运行在 ui 线程中的
@Override protected void onPreExecute() {
super.onPreExecute();
}
// 执行耗时操作之前调用的一个方法,相当于我们的初始化的方法
该方负责执行我们耗时的业务逻辑操作,也就是说他是在子线程中运行的,如果想要更新 ui 怎么办
@Override
protected String doInBackground(String... params) {
return null;
}
调用的我们的 publicProgress 方法可以更新我们的 ui,此方法是在子线程中运行的
publishProgress(Object o);
此方法表示更新我们的进度,可用于更新下载的进度条等.
此方法是在主线程中执行的方法,一旦我们在耗时逻辑代码中调用了 publicProgress 就表示我们希望更新进度条.
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
此时就会调用这个方法到 ui 线程跟新我们的进度条.
注意:task 实例必须在 ui 线程中创建 task.excute(初始参数比如 url);
我们无需手动的调用 task 中的方法
task 只能被执行一次
来源: https://www.cnblogs.com/hhua-best/p/8270270.html