码迷,mamicode.com
首页 > 移动开发 > 详细

Android--从网络获取图片的三种方法

时间:2015-10-30 09:14:43      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况。对于这种情况,一般的方法就是耗时操作用线程来实现。下面列三种获取url图片的方法:
1.直接获取:(容易:ANR,不建议)
mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ;
Drawable drawable = loadImageFromNetwork(IMAGE_URL);
mImageView.setImageDrawable(drawable) ;

 

公用方法:
private Drawable loadImageFromNetwork(String imageUrl)
{
Drawable drawable = null;
try {
// 可以在这里通过文件名来判断,是否本地有此图片
drawable = Drawable.createFromStream(
new URL(imageUrl).openStream(), "image.jpg");
} catch (IOException e) {
Log.d("test", e.getMessage());
}
if (drawable == null) {
Log.d("test", "null drawable");
} else {
Log.d("test", "not null drawable");
}

return drawable ;
}

2. 后台线程获取url图片:

mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ;
new Thread(new Runnable(){
Drawable drawable = loadImageFromNetwork(IMAGE_URL);
@Override
public void run() {

// post() 特别关键,就是到UI主线程去更新图片
mImageView.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
mImageView.setImageDrawable(drawable) ;
}}) ;
}

}).start() ;

3.AsyncTask获取url图片

mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ;
new DownloadImageTask().execute(IMAGE_URL) ;
private class DownloadImageTask extends AsyncTask<String, Void, Drawable>
{

protected Drawable doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}

protected void onPostExecute(Drawable result) {
mImageView.setImageDrawable(result);
}
}

前提:
下载ImageLoader的jar包,并存储到libs文件夹下
地址:https://github.com/nostra13/Android-Universal-Image-Loader/tree/master/downloads

1.在src文件夹下创建新的application

1.1在onCreate()方法下调用initImageLoader

  initImageLoader(getApplicationContext());

1.2定义initImageLoader方法,主要是完成配置

public static void initImageLoader(Context context) {

 
   ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)

  .threadPriority(Thread.NORM_PRIORITY - 2)

  .denyCacheImageMultipleSizesInMemory()

  .discCacheFileNameGenerator(new Md5FileNameGenerator())

  .tasksProcessingOrder(QueueProcessingType.LIFO)

   .writeDebugLogs() // Remove for release app

  .build();

ImageLoader.getInstance().init(config);

}

2、在Manifest.XML文件下改写application的name(就是刚才新建的继承Application的类),并且在开头(application之前)注册网络和其他存储(??)方法

(1和2其实应该反过来,因为如果Manifest.XML中的更改没有保存,那么1种的文件会不断报错)

 
   <application 
    android:name=".XApplication"
    ...>
   </application>

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

3、在Activity中应用
3.1实例化ImageLoader

 
protected ImageLoader imageLoader =    ImageLoader.getInstance();

3.2配置option

 
   options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.dog)//加载图片时显示的默认图片
            .showImageForEmptyUri(R.drawable.girl)//访问地址无内容时显示的图片
            .showImageOnFail(R.drawable.luobo)//加载失败时显示的图片
            .cacheInMemory(true)//是否存储到内存中??
            .cacheOnDisc(true)//是否加载到硬盘?SD卡??
            .considerExifParams(true)
            .displayer(new RoundedBitmapDisplayer(20))
            .build();

3.3调用displayImage()函数加载图片(需要写在具体加载图片View的地方)

 
   imageLoader.displayImage(getItem(position).image, peopleImage, options);

(使用比较简单的函数:第一个参数是调用的URL(String类),第二个是需要放图片的位置,不是R对象,而是java文件中的对象,如Holder.Image等,第三个是设置好的参数)

Android--从网络获取图片的三种方法

标签:

原文地址:http://www.cnblogs.com/zrui513/p/4922352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!