使用 AsyncTask 下载图片,并在下载前设置本地图片显示

来源:互联网 发布:植物大战僵尸源码 编辑:程序博客网 时间:2024/05/21 11:35

使用 AsyncTask 在后台线程中下载数据。AsyncTask 是个封装类,它通过一个内部的线程池管理线程的并发。除了管理后台线程外,在操作执行前,中,后都会提供回调方法(不要在  doInBackground() 中更新视图)。 

下面是一个简单的例子,效果如下(AndroidStudio 1.5):



实现下载图片并显示的类:

NetImageView.java :

package com.crazy.asyncdownload;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.AsyncTask;import android.util.AttributeSet;import android.widget.ImageView;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;public class NetImageView extends ImageView {    private Drawable mHolder, mImage;    public NetImageView(Context context) {        this(context, null);    }    public NetImageView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public NetImageView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    // 在下载完成之前,在要显示图片的位置先提供一个本地的图片    public void setHolderImage(Drawable drawable) {        mHolder = drawable;        if (mImage == null) {            setImageDrawable(mHolder);        }    }    // 在下载完成之前,在要显示图片的位置先提供一个本地的图片    public void setHolderImage(int resId) {        mHolder = getResources().getDrawable(resId);        if (mImage == null) {            setImageDrawable(mHolder);        }    }    public void setImageUrl(String url) {        DownloadTask task = new DownloadTask();        task.execute(url);    }    private class DownloadTask extends AsyncTask<String, Void, Bitmap> {        @Override        protected Bitmap doInBackground(String... params) {            String url = params[0];            try {                URLConnection connection = (new URL(url)).openConnection();                InputStream is = connection.getInputStream();                BufferedInputStream bis = new BufferedInputStream(is);                ByteArrayOutputStream baos = new ByteArrayOutputStream(50);                int b = 0;                while ((b = bis.read()) != -1) {                    baos.write((byte)b);                }                byte[] imageData = baos.toByteArray();                return BitmapFactory.decodeByteArray(imageData, 0, imageData.length);            } catch (IOException e) {                return null;            }        }        @Override        protected void onPostExecute(Bitmap bitmap) {            mImage = new BitmapDrawable(getContext().getResources(), bitmap);            if (mImage != null) {                setImageDrawable(mImage);            }        }    }}


MainActivity.java :
package com.crazy.asyncdownload;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        NetImageView imageView = (NetImageView)findViewById(R.id.netImage);        imageView.setHolderImage(R.drawable.ic_launcher);        imageView.setImageUrl("http://img.ivsky.com/img/tupian/pre/201509/02/erhai_shenguang.jpg");    }}


content_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:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context="com.crazy.asyncdownload.MainActivity"    tools:showIn="@layout/activity_main">    <com.crazy.asyncdownload.NetImageView        android:id="@+id/netImage"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

在 AndroidManifest.xml 中注册权限:

<uses-permission android:name="android.permission.INTERNET"/>


0 0
原创粉丝点击