Android的AsyncTask类的简单教程

首先介绍AsyncTask中定义的以下几个方法:

onPreExecute():该方法在执行后台操作前被UI线程调用,可以做一些准备工作,如图片加载之前先显示进度条等

doInBackground(Params...):该方法运行在后台线程中,比较耗时的操作可以写在此方法中

onProgressUpdate(Progress...):该方法只有在doInBackground(Params...)方法中调用了publishProgress()方法时候才会执行,用来显示后台任务的进展情况

onPostExecute(Result): doInBackground(Params...)方法执行完毕以后,此方法会被UI线程调用,可以在此方法中对UI进行操作,比如显示图片内容等。

----------------------------------------------------------

其次是AsyncTask中的三个参数 :

Params 启动任务执行的输入参数,比如HTTP请求的URL。       

Progress 后台任务执行的进度值。        

Result 后台执行任务最终返回的结果。

------------------------------------------------------------------

最后用一个异步加载网络图片的实例更好的体现AsyncTask的作用:

新建一个空的Android项目工程,我新建的是AsyncTaskTest,

先贴出项目最终的运行效果图啦:

Android的AsyncTask类的简单教程_第1张图片

然后修改main_activity.xml的代码,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_test"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="点击asyncTask加载图片" />

    <include layout="@layout/layout" />
</LinearLayout>

由此可知,主布局并不复杂,LinearLayout里嵌套一个Button,和引用一个名字叫layout.xml的文件。

效果图如下:

Android的AsyncTask类的简单教程_第2张图片

那么问题来了,layout.xml文件是何方神圣呢?

你们可以猜猜,也可以自己动手吧。(文章尾处有惊喜哦、)

 

主活动类MainActivity.java的代码修改如下:

package com.yaowen.asynctasktest;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {
    private Button downBitmap;
    private ProgressBar progressBar;
    private ImageView imageView;
    //将要异步加载的图片的地址,这里我用的自己搭建的服务器上图片的地址啦
    private static final String URL_PATH = "http://192.168.3.200:8080/mytest/1.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        // new MyAsyncTask().execute(URL1);
    }

    /**
     * 初始化所有UI控件
     **/
    private void initView() {
        downBitmap = (Button) findViewById(R.id.btn_test);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        imageView = (ImageView) findViewById(R.id.imageView);

        downBitmap.setOnClickListener(new Listener());
    }

    /**
     * 按钮事件响应类,用于启动MyAsyncTask类异步加载并显示图片
     **/
    class Listener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.btn_test) {
                //这里启动MyAsyncTask类异步加载并显示图片
                new MyAsyncTask().execute(URL_PATH);
            }
        }
    }

    /**
     * 自定义异步任务类
     *
     * @author YAOWEN
     * @String 传入的参数为图片的URL地址,String类型,
     * @Void 进度值先不考虑所以返回为空,
     * @Bitmap 后台执行任务最终返回的结果为一张图片Bitmap类型
     */
    class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected void onPreExecute() {//后台没有运行完毕之前做的准备工作,在这我们让原本隐藏的progressBar显示
            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);//后台运行的时候进度条显示
        }

        @Override
        protected Bitmap doInBackground(String... params) {//在后台进行网络访问,得到图片并返回
            String url = params[0];
            Bitmap bitmap = null;
            URLConnection connection;//定义网络连接对象
            InputStream inputStream;
            try {
                connection = new URL(url).openConnection();
                inputStream = connection.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(inputStream);
                //将输入流解析成Bipmap
                bitmap = BitmapFactory.decodeStream(bis);
                inputStream.close();
                bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {//在此方法中接收后台返回的Bitmap值并且设置到UI
            super.onPostExecute(bitmap);
            progressBar.setVisibility(View.GONE); //显示的progressBar再设置为隐藏
            imageView.setImageBitmap(bitmap); //在片此方法中设置UI线程显示图
        }
    }
}

代码为了可读性,我特意加入了注释,这样子便于一些初学者读懂代码吧~~~~~~

 

上面说到了文章尾处有惊喜,所以叫layout.xml的文件原来是这个“妖孽”!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".ImageActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:visibility="gone" />
</RelativeLayout>

也不复杂啦,相信大家都能想出来了!!!!

最后,祝大家学有所成~!

 

你可能感兴趣的:(bitmap,AsyncTask,异步加载,异步任务类)