大佬教程收集整理的这篇文章主要介绍了AsyncTask详解及简单示例,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
众所周知,程序的执行主要是在UI线程上执行(也就是主线程),当有耗时任务的时候,例如从网络上下载文件、进行数据库查询、进行复杂的逻辑运算的时候,如果在主线程中执行,会导致主线程阻塞,APP无法响应,asynctask是Android官方提供的帮助类,可以开启个独立线程执行某个耗时任务。
AsyncTask是一个抽象类,如果使用必须用别的类来继承他。主要的方法如下:
方法 | 作用 | 线程 |
---|---|---|
onPreExecute() | 程序执行前设置UI | 主线程 |
doInBackground() | 在后台执行的具体任务 | 子线程 |
onProgressUpdate() | 程序执行过程中设置UI | 主线程 |
onPostExecute() | 程序执行完设置UI | 主线程 |
AsyncTask <Params, Progress, Result>
参数名称 | 参数作用 |
---|---|
Params | doInBackground()参数 |
Progress | onProgressUpdated()参数 |
Result | onPostExecute()参数 |
注意: 不需要写参数就写void doInBackground必须实现,其他方法可以不实现 onPostExecute使用的参数是doInBackground的返回值 doInBackground参数需要在构造AsyncTask时传入
点击按钮,文字变为Waiting,并且随机等待一段时间后,更新文字内容。 (随机等待一段时间模拟费时操作)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I am ready to start work!"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:onClick="startTask"
android:text="Start Task"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView1"/>
</androidx.constraintlayout.widget.ConstraintLayout>
代码很好懂,Button绑定个事件,在MainActivity中进行实现。
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
mTextView = this.findViewById(R.id.textView1);
}
public void startTask(View view) {
mTextView.setText("Wait.......");
//开始AsyncTask
new SimpleAsyncTask(mTextView).execute();
}
}
其他代码都很好懂,重点说一下这个:
new SimpleAsyncTask(mTextView).execute();
mTextView为什么传入,其实就是SimpleAsyncTask这个的构造函数所需要的参数,之后的execute就表示开始执行,因为onPreExecute不需要参数,所以这里不传入,根据情况传参。
public class SimpleAsyncTask extends AsyncTask<Void, Integer, String> {
private WeakReference<TextView> mTextView;
SimpleAsyncTask(TextView tv) {
//弱引用 可以被垃圾回收机制回收如果必要的话
mTextView = new WeakReference<>(tv);
}
@Override
protected String doInBackground(Void... voids) {
Random r = new Random();
int n = r.nextInt(11);
int s = n * 200;
try {
Thread.sleep(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Awake at last after sleeping for " + s + " milliseconds!";
}
@Override
protected void onPostExecute(String s) {
// 参数String是doInBackground返回的参数
// 因为是弱引用 必须用get方法获得具体的对象
mTextView.get().setText(s);
}
}
首先讲一下弱引用
: 假如是普通的方法,当Activity被摧毁之后,对TextView的引用意味着Activity永远不会被垃圾回收机制回收,个人理解,因为你要用这个Activity,所以其不会被回收,会导致内存泄漏;弱引用,代表必要情况下可以被垃圾回收机制回收。
doInBackground
–必须实现的方法 该代码中随机暂停一段时间后,返回字符串。
onPostExecute
–在doInBackground
执行完后执行 String参数正是doInBackground
的返回值,并且这个是执行在UI线程上的,可以对UI进行更新。
在点击按钮之后,旋转屏幕,会发现UI无法正常更新,这是因为旋转屏幕重建了UI,但是AsyncTask会在后台正常运行,但是无法更新UI,若想正常更新,需要AsyncTaskLoader
。
可参考我的:(未来补上 哈哈哈哈)
以上是大佬教程为你收集整理的AsyncTask详解及简单示例全部内容,希望文章能够帮你解决AsyncTask详解及简单示例所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。