AsyncTask 图片/网页下载实例

关于AsyncTask的相关介绍
前面《第一行代码》笔记中已经写的非常详细了
可以参考:四大组件之Service

1 图片下载的实战案例 (无进度条)

    1. 新建项目,首先来看布局文件,简单放了3个View



    

    

界面:


AsyncTask 图片/网页下载实例_第1张图片
image.png
    1. 再来看MainActivity
      我们后面会新建一个AsyncTask异步任务类DownLoadTask
      当点击按钮后,直接new DownLoadTask,并调用execute启动异步任务
      在它的构造方法里,需要我们传入了TextView和ImageView的实例,主要用于更新界面UI和展示图片
      execute代表开始执行异步任务,我们传入一个url
      这几个参数都是我们DownLoadTask自定义指定的
package com.example.servicebestdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView status;
    private Button button1;
    private ImageView pic;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        status = findViewById(R.id.status);
        button1 = findViewById(R.id.button1);
        pic = findViewById(R.id.download_pic);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownLoadTask(status,pic).execute("https://www.baidu.com/img/bd_logo1.png?where=super");
            }
        });
    }
}

    1. 最后来看DownLoadTask
      第一个泛型参数为String,这就是为什么我们根据需求要传一个URL地址过来
      然后可以看到我们传入了TextView和ImageView实例过来
      开始任务前,执行onPreExecute方法,同时更新一下UI提示正在下载
      然后开始耗时任务,执行doInBackground方法,params[0]拿传过来的URL地址,使用HttpURLConnection开始下载,最后将数据转换成Bitmap
      任务完成后,执行onPostExecute方法,拿执行结果,我们让1代表下载成功,最后把下载的图片展示出来。
package com.example.servicebestdemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


public class DownLoadTask extends AsyncTask{
    TextView view;
    ImageView pic;
    Bitmap mDownLoadBtBitmap;

    public DownLoadTask(TextView view , ImageView pic) {
        this.view = view;
        this.pic = pic;
    }

    @Override
    protected void onPreExecute() {
        view.setText("正在下载中...");
    }

    @Override
    protected Integer doInBackground(String... params) {
        URL imgUrl = null;
        //拿URL
        try {
            imgUrl = new URL(params[0]);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //开始下载
        try {
            //使用HttpURLConnection
            HttpURLConnection connection = (HttpURLConnection) imgUrl.openConnection();
            connection.setDoInput(true);
            connection.connect();
            //将得到的数据转化成InputStream
            InputStream inputStream = connection.getInputStream();
            //将InputStream转换成Bitmap
            mDownLoadBtBitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 1;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        if(integer == 1 ){
            view.setText("下载完成!");
        }
        if(mDownLoadBtBitmap!=null){
            pic.setImageBitmap(mDownLoadBtBitmap);
        }
    }
}

效果:


AsyncTask 图片/网页下载实例_第2张图片

2 网页下载实例 (带进度条)

  • 就不过多赘述了,直接上代码,使用HttpUrlConnection请求网络
package com.example.asynctaskdemo;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btn;
    private TextView message;
    private EditText url ;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.start);
        btn.setOnClickListener(this);
        message = (TextView) findViewById(R.id.message);
        url = (EditText) findViewById(R.id.url);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start:
                String urlStr = url.getText().toString();
                PageTask task = new PageTask(this);
                task.execute( urlStr);
                break;
            default:
                break;
        }
    }

    /**
     *  第一个参数:传入doInBackground()方法的参数类型 ,下载任务通常传Url地址
     *  第二个参数:传入onProgressUpdate()方法的参数类型,通过publishProgress每次将数据传入 onProgressUpdate,更新进度
     *  第三个参数:传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型
     *
     * @author root
     *
     */
    class PageTask extends AsyncTask {
        // 可变长的输入参数,与AsyncTask.exucute()对应
        ProgressDialog pdialog;

        public PageTask(Context context) {
            pdialog = new ProgressDialog(context, 0);
            pdialog.setButton("cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int i) {
                    dialog.cancel();
                }
            });
            pdialog.setCancelable(true);
            pdialog.setMax(100);
            pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pdialog.show();

        }

        /**
         * 异步执行的耗时处理
         */
        @Override
        protected String doInBackground(String... params) {

            try {
                // params[0]代表连接的url
                URL url = new URL(params[0]);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestProperty("Accept-Encoding", "identity");
                connection.connect();
                long length = connection.getContentLength();
                InputStream is = connection.getInputStream();
                String s = null;
                if (is != null) {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    byte[] buf = new byte[128];
                    int ch = -1;
                    int count = 0;
                    while ((ch = is.read(buf)) != -1) {
                        baos.write(buf, 0, ch);
                        count += ch;
                        if (length > 0) {
                            // 如果知道响应的长度,调用publishProgress()更新进度
                            publishProgress((int) ((count / (float) length) * 100));
                        }
                        // 让线程休眠50ms
                        Thread.sleep(50);
                    }
                    s = new String(baos.toByteArray());
                }
                // 返回结果
                return s;
            } catch (Exception e) {
                e.printStackTrace();

            }
            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
        //异步执行完毕(doInBackground执行完毕,将最终结果传到UI线程中),这个方法被UI线程调用,更新UI线程
        //参数result为doInBackground返回的参数
        @Override
        protected void onPostExecute(String result) {
            // 返回HTML页面的内容
            message.setText(result);
            pdialog.dismiss();
        }
        //任务执行之前,UI线程调用,做一些准备工作,如显示进度条
        @Override
        protected void onPreExecute() {
            // 任务启动,可以在这里显示一个对话框,这里简单处理
            message.setText("任务开始");
        }

        //更新UI线程的进度
        @Override
        protected void onProgressUpdate(Integer... values) {
            // 更新进度
            System.out.println("" + values[0]);
            message.setText("" + values[0]);
            pdialog.setProgress(values[0]);
        }

    }

}
  • 布局文件


    
    
  • 最后记得在配置文件里加入请求网络的权限

运行效果:


AsyncTask 图片/网页下载实例_第3张图片

你可能感兴趣的:(AsyncTask 图片/网页下载实例)