本文介绍安卓的多线程与异步任务处理的机制
一、多线程
1.主线程与子线程
每个 Android 应用都有一个主线程,负责处理界面(包括测量和绘制视图)、协调用户互动以及接收生命周期事件。
主线程一般被用于操作UI界面,与用户进行交互,所以也被称为UI线程。
与此相对的,在一些耗时比较久的任务处理中,比如从网络上下载资源、进行后台服务等,这些是用户看不到的地方。我们不能直接将这些任务放在主线程中进行处理,不然会耗费大量资源并且出现错误,降低用户体验。
所以一般遇到这些任务,需要在主线程之外重新开一个子线程进行任务处理,也就是所谓的非UI线程。
注:子线程(非UI线程)里的操作是不能直接对UI界面进行更新的。
通过一个从网络上下载图片的案例来理解主线程与子线程。
主要逻辑:在界面上创建一个Button按钮,点击后从网络上下载一幅图片。
主要步骤:
1.在布局文件中创建按钮和图片视图,给按钮添加事件。
2.在Java文件中编写事件处理逻辑。
3.在AndroidManifest清单文件中添加网络权限。
activity_main.xml文件:
<Button
android:id="@+id/bt1"
adnroid:onClick="download"
android:layout_width="128dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginStart="134dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="134dp"
android:text="Download" />
<ImageView
android:id="@+id/image"
android:layout_width="300dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:background="@color/colorAccent" />
效果:
Java类文件
package com.example.handler;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {
//实例化ImageView对象
ImageView mimageView;
@Override
protected void onCreate(Bundle savedInstanceState)