Android之AsyncTack初识

本文深入探讨了Android中AsyncTask的使用方法,包括其参数、回调方法及如何通过子类实现异步任务。通过实例展示了如何利用AsyncTask从网络加载图片并在UI线程更新显示,同时处理进度显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次初步学习了解了AsyncTack的的用法。AsyncTack的主要作用于通知主线程在子线程中更新UI;封装、简化异步操作。

构建AsyncTask子类参数:

AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需求指定如下三个泛型参数。

Params:启动任务时输入参数类型

Progress:后台任务执行中返回进度值的类型

Result:后台执行任务完成后返回结果的类型

构建AsyncTask子类的回调方法:

dolnBackground:必须重写,异步执行后台线程将要完成的任务。

onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作。

onPostExecute:当dolnBackground()完成后,系统会自动调用onPostExecute()方法,并将dolnBackground方法返回的值传回该方法,展示处理结果

onProgressUpdate:在dolnBackground()方法中调用publishProgress()方法更新任务的执行进度,就会触发该方法。

AsyncTask方法启动用execute方法启动。

实例(通过网络地址加载图片并显示)

在此附上帅照一张为程序运行效果图。

布局文件中,我采用了进度条和图片空间,先把进度条控件隐藏起来。AsyncTask放回回调onPreExecute方法再显示出来。

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:padding="16dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.a13468.asynctack01.MainActivity">
    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ProgressBar
        android:id="@+id/progressbar"
        android:visibility="gone"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

MainActivity.java文件

由于网速过快,导致与于进度条还没有显示图片就夹在完了,使用线程Treed.sleep(3000),让图片3秒后显示

package com.example.a13468.asynctack01;
/**
 * 通过网络地址下载显示一张图片
 */

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;//手动导入URL包

import java.io.InputStream;
import java.net.URLConnection;

public class MainActivity extends Activity {
    private ImageView image;
    private ProgressBar progressbar;
//创建网络地址
    private static String URL="http://b226.photo.store.qq.com/psb?/V11P5K533TzyHM/";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        image = findViewById(R.id.image);
        progressbar = findViewById(R.id.progressbar);
        new MyAsyncTack().execute(URL);//启动AsyncTack方法
    }
    class MyAsyncTack extends AsyncTask<String,Void,Bitmap>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressbar.setVisibility(View.VISIBLE);//进度条可见
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            progressbar.setVisibility(View.GONE);//进度条不可见
            image.setImageBitmap(bitmap);
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            //获取传递进来的参数
            String url=strings[0];//传递参数取出对应的URL地址
            Bitmap bitmap=null;
            URLConnection connection;//定义网络连接对象
            InputStream is;//用于获取数据的输入流
            try {
                connection =new URL(url).openConnection();//获取网络连接对象
                is=connection.getInputStream();//获取输入流
                Thread.sleep(3000);//睡眠3秒显示加载图片
                BufferedInputStream bis=new BufferedInputStream(is);
                bitmap= BitmapFactory.decodeStream(bis);//将输入流解析成bitmap;
                //关闭输入流
                is.close();
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return bitmap;
        }

    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值