使用 AsyncTask 下载图片,并在下载前设置本地图片显示
2015-12-09 00:05
399 查看
使用 AsyncTask 在后台线程中下载数据。AsyncTask 是个封装类,它通过一个内部的线程池管理线程的并发。除了管理后台线程外,在操作执行前,中,后都会提供回调方法(不要在 doInBackground() 中更新视图)。
下面是一个简单的例子,效果如下(AndroidStudio 1.5):
实现下载图片并显示的类:
NetImageView.java :
MainActivity.java :
content_main.xml :
在 AndroidManifest.xml 中注册权限:
下面是一个简单的例子,效果如下(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"/>
相关文章推荐
- Excel开发学习笔记:查找与创建worksheet
- 快速排序--过程详解
- 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
- Android Studio 出现非法字符 'ufeff'错误
- Python异常
- windows下安装python包管理器pip
- Linux磁盘系统 - 管理磁盘的命令
- 仅1个例子轻松学习正则表达式
- PHP判断手机是IOS还是Android
- 学习php设计模式 php实现观察者模式(Observer)
- 学习php设计模式 php实现备忘录模式(Memento)
- 作为程序员必知的16个最佳PHP库
- 微信支付PHP SDK之微信公众号支付代码详解
- 分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
- thinkPHP使用post方式查询时分页失效的解决方法
- linux grep命令技巧
- js获取鼠标位置实例详解
- 深入探讨前端框架react
- 详解js跨域原理以及2种解决方案
- js实现跨域访问的三种方法