Android的UI线程主要负责处理用户的按键事件、触屏事件等。因此其他阻塞UI线程的操作不应该在主线程中操作。为了避免UI线程失去响应的问题,Android程序采用将耗时操作放在新线程中完成的方式,但是新线程可能需要动态更新UI组件,比如获取网络资源操作放在新线程中完成。但由于新线程不允许直接更新山I组件,为了解决这个问题,Android提供了异步任务 (AsyncTask) 的方式实现异步线程的操作。
运行环境
- Windows 10
- Android Studio Arctic Fox (2020.3.1)
- jdk1.7.0_67
本次实验我们使用该方法从网络上下载一张图片
AsyncTask
AsyncTask<Params,Progress,Result>
是一个抽象类,通常被用于继承,继承时要指定如下三个泛型参数
①Params
启动任务执行时的输入参数的类型。
ImageDownTask task=new ImageDownTask(img);
task.execute(url);
②Progress
后台任务完成的进度值的类型。
protected void onProgressUpdate(Void... values)
③Result
后台任务完成后返回结果的类型。
protected Bitmap doInBackground(String... strings)
使用方法
(1)创建AsyncTask的子类,并指定参数类型。如果某个参数不需要,则指定为Void类型,
(2)实现AsyncTask的方法,如doTnBackground (Params•••):后台线程将要完成的功能,一般有获取网络资源等耗时性的操作;第二个方法onPostExecute (Result result):在do InBackground ( 方法执行完以后,系统会自动调用onPostExecute 0方法,并接受其返回值。这里一般负责更新UI线程等操作。
(3)调用AsyncTask子类的实例的execute (Params•• params)方法执行耗时操作
新建一个项目
1.添加控件
在activity_main.xml中添加一个ImageView和一个Button控件(我采用的是线性布局)。
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="195dp" />
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载" />
2.声明控件并对Button设置监听
在MainActivity中对刚添加的两个控件声明,并对Button设置监听。
创建一个异步任务类
@Override
public void onClick(View view) {
ImageDownTask task=new ImageDownTask(img);
task