Android AsyncTask使用方法(防止内存泄露)

目录

1. 定义

1.1 AsyncTask 的三个泛形参数

1.2 AsyncTask的4个核心方法

1.3 取消任务

2. 简单Demo上手

2.1 Java 版本

2.2 Kotlin 版本

3. AsyncTask 如何防止内存泄露


1. 定义

官方解释:AsyncTask可以正确及方便地使用UI线程。此类允许您执行后台操作并在UI线程上发布结果,而无需通过操作Thread和Handler。AsyncTasks应该用于短操作(最多几秒钟)。异步任务在后台线程运行计算,其结果在UI线程上发布。

1.1 AsyncTask 的三个泛形参数

java.lang.Object
   ↳	android.os.AsyncTask<Params, Progress, Result>

1. Params(传入参数):在执行 execute(Params... params) 任务方法时传入。

2. Progress(执行进度):在后台计算期间发布的进度单位。

3. Result(执行结果):后台的计算结果。 这三个参数不是每次都必须被定义使用,如果你不想使用,就定义为 Void。 如果三个参数都不使用,如下所以:

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

1.2 AsyncTask的4个核心方法

当 AsyncTask 被执行时,会经历4个步骤,分别是onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()。 分别是:

1、onPreExecute():在 UI 线程上工作,在任务执行 doInBackground() 之前调用。此步骤通常用于设置任务,例如在用户界面中显示进度条。

2、doInBackground(Params...params):在子线程中工作,在 onPreExecute() 方法结束后执行,这一步被用于在后台执行长时间的任务,Params 参数通过 execute(Params) 方法被传递到此方法中。任务执行结束后,将结果传递给 onPostExecute(Result) 方法,同时我们可以通过 publishProgress(Progress) 方法,将执行进度发送给 onProgressUpdate(Progress) 方法。

3、onProgressUpdate(Progress...values):在 UI 线程上工作,会在 doInBackground() 中调用 publishProgress(Progress) 方法后执行,此方法用于在后台计算仍在执行时(也就是 doInBackgound() 还在执行时)将计算执行进度通过 UI 显示出来。例如,可以通过动画进度条或显示文本字段中的日志,从而方便用户知道后台任务执行的进度。

4、onPostExecute(Result result):在 UI 线程上工作,在任务执行完毕(即 doInBackground(Result) 执行完毕)并将执行结果传过来的时候工作。

1.3 取消任务

一个任务可以通过调用 cancel() 方法在任何时间取消。调用此方法后再调用 isCancelled() 方法,返回 true。调用此方法后,onPostExecute() 方法将在 onCancel() 方法返回后调用,而不是在 doInBackground() 返回结果后调用。为了确保任务被尽快取消,你应该在 doInBackground() 方法中进行周期性地检查 isCancelled() 的返回值,如果可能的话(例如在一个循环中进行检查),比如下面例子:

@Override
protected String doInBackground(String... strings) {
    for (int i = 1; i <= 10; i++) {
		···
        //在for循环中进行周期性检查,检查异步任务是否被取消
        if (isCancelled()) {
            break;
        }
        ···
    }

    ···
    return result;
}

2. 简单Demo上手

点击 Start AsyncTask 按钮,开始执行异步任务,点击 Stop AsyncTask 按钮,取消任务执行。效果如下所示:

2.1 Java 版本

详细代码:

public class AsyncTaskActivity extends AppCompatActivity implements View.OnClickListener {
    private ProgressBar progressBar;
    private TextView displayTv;
    private Button startBtn, stopBtn;
    private MyAsyncTask myAsyncTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值