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

本文介绍了一个使用AsyncTask在Android应用中下载并显示网络图片的方法。通过创建自定义的ImageView组件,实现了图片预加载及异步下载功能。

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

使用 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"/>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值