今天新工作入职的第一天,之前一直说要写一些关于自己的技术知识总结,后来一直拖延没有进行下去。今天就当是一个开始,可能我现在写的东西很糟糕,甚至有点惨不忍睹。如果觉得碍眼的,请移步其他大牛的博客,我这只是相当于记笔记给自己看了。
学习原文:https://www.cnblogs.com/xiaoluo501395377/p/3430542.html
AysncTask: 异步任务。一般用于主线程跟子线程之间的通讯问题。
这个读起来,其实我还是比较难理解的,尤其是后面的“其介于Thread和Handler之间”。按照读者的字面意思,AnsycTask可以理解为一个用于多线程编程的框架,只是这个框架被收罗进了SDK中。后半部分我的理解是:效率在Thread跟Handler之间?(不确定是否正确理解,欢迎大牛指正)
实现过程:定义当前类继承(extends)AysncTask这个抽象类,并且需要实现唯一的一个doInBackground抽象方法。
掌握技巧:3个泛型 4个步骤
3个泛型:继承(extends)AysncTask这个抽象类时,需要定义异步任务的三个泛型参数。
AsyncTask <Params, Progress, Result>
这三个需要定义的参数类型分别代表的意思是:
Params: 这个泛型指定的是我们传递给异步任务执行时的需要的参数的类型;
Progress: 这个泛型指定的是异步任务在执行的过程中将执行的进度返回给UI线程,这个执行进度的类型;
Result: 这个泛型指定的是异步任务执行完成之后返回给UI线程的最终结果的类型。
注意以上三种均为类型,而非数据!!!如果不指定或者不需要的话,写成Void即可。都不指定的话,就可以写成
AsyncTask <Void, Void, Void>
4个步骤:执行一个异步任务,需要按照下面四个步骤分别执行。
public class GetXXXX extends AsyncTask<String, Integer, String> {
protected void onPreExecute() {
// TODO something
}
protected String doInBackground(String... params) {
// TODO something
}
protected void onProgressUpdate(Integer... values) {
// TODO something
}
protected void onPostExecute(String string) {
// TODO something
}
}
onPreExecute() : 这个方法是在执行异步任务之前的时候执行的,并且运行在UI线程。通常可以在这个方法里面写一些UI控件的初始化。
doInBackground(Params... params): 这个方法是在onPreExecute方法执行完之后马上执行的方法。这个方法就是用来处理异步任务的方法,可以尝试把一些好事操作写到这个里面。执行这个方法时,Android操作系统会在后台的线程池当中开启一个worker thread来执行这个方法的内容(关于AysncTask跟线程池的关系,这里的解释比较浅,后续有必要深入了解),所以这个方法是在工作线程(子线程)中执行的。这个方法执行完之后可以将处理完的结果发送至最后一个onPostExectue方法。
onProgressUpdate(Progress... values): 这个方法是在UI线程中执行的。我们在异步任务执行的时候,有时候需要将执行的进度反馈到界面显示。这个方法可以不断被调用,并反馈给UI线程我们需要的进度。至于如何调用,则需要在doInBackground(Params... params)方法中,调用方法publishProgress(Progress)一次,onProgressUpdate(Progress... values)就会接收一次执行进度数据。这里不难看出,publishProgress(Progress)其实是需要间隔持续调用的吧,至于间隔周期跟持续时间,可以自行通过代码设置(一般任务内容多少决定持续时间,间隔周期的话可以通过循环设置)。
onPostExecute(Result... result): 这个方法是当异步任务执行完成之后,用于接收和处理结果的方法。这个方法执行在UI线程,可以将结果实时反馈到界面上面。
以上的四个方法,除了doInBackground(Params... params)方法是必须要实现的以外,其他的都是非必须的。因为你可能只需要执行异步任务内容,其他(执行前准备/执行进度反馈/执行后结果反馈)都不需要。
(练手代码略过...有想看的可以去看下原文地址的代码,毕竟我这个是学习笔记,自己尝试总结用的,告罪...)
AysncTask其他重要知识点:
1.Cancelling a Task(取消异步任务)
可以在任何时刻取消异步任务的执行,通过调用cancel(boolean)方法就可实现。调用完这个方法后,系统会随后调用isCancelled()方法并返回true。如果调用了这个方法,那么在doInBackground()方法执行完之后,就不会调用onPostExcute()方法了,取而代之的是调用onCancelled()方法。为了确保Task已经被取消了,我们需要经常调用isCancelled()方法来判断,如果有必要的话。(其实这里我的理解是:为防止内存泄漏,这样的判断是必不可少的。)
2.在使用AysncTask做异步任务的时候必须要遵循的原则:
a.AysncTask类必须在UI线程当中加载,在Android4.1版本后,这些都是自动完成的;
b.AysncTask的对象必须在UI线程当中实例化(即 new)
c.execute方法必须在UI线程中调用
d.不要手动去调用AysncTask的onPreExecute,doInBackground,publishProgress,onProgressUpdate,onPostExecute方法,这些都是由Android系统自动调用的。(publishProgress 这个方法 可以在doInBackground中手动调用吧?)
e.AysncTask任务只能被执行一次。(关于只能被执行一次,我看了下原文评论,觉得应该同一个Task对象同一时间只能执行一次,这个有待考证)
本文学自(https://www.cnblogs.com/xiaoluo501395377/p/3430542.html) 如有不当之处,欢迎指正。