您的位置:首页 > 其它

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

2015-12-09 00:05 399 查看
使用 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"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: