android图片下载问题

============问题描述============

哪位大神帮我看看下面的代码,为什么传入Url最后得到的drawable是空呢?

// 网络图片先下载到本地cache目录保存,以imagUrl的图片文件名保存。如果有同名文件在cache目录就从本地加载

	public static Drawable loadImageFromUrl(Context context, String imageUrl) {

		Drawable drawable = null;

		if (imageUrl == null)

			return null;

		String imagePath = "";

		String fileName = "";

		// 获取url中图片的文件名与后缀

		if (imageUrl != null && imageUrl.length() != 0) {

			fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);

		}

		// 图片在手机本地的存放路径,注意:fileName为空的情况

		imagePath = context.getCacheDir() + "/" + fileName;

		Log.i(TAG, "imagePath = " + imagePath);

		File file = new File(context.getCacheDir(), fileName);// 保存文件

		System.out.println("cachedir = " + context.getCacheDir());

		Log.i(TAG, "file.toString()=" + file.toString());

		if (!file.exists() && !file.isDirectory()) {

			try {

				// 可以在这里通过文件名来判断,是否本地有此图片

				FileOutputStream fos = new FileOutputStream(file);

				InputStream is = new URL(imageUrl).openStream();

				int data = is.read();

				while (data != -1) {

					fos.write(data);

					data = is.read();

				}

				fos.close();

				is.close();

				// drawable = Drawable.createFromStream(

				// new URL(imageUrl).openStream(), file.toString() ); //

				// (InputStream) new URL(imageUrl).getContent();

				drawable = Drawable.createFromPath(file.toString());

				Log.i(TAG, "file.exists()不文件存在,网上下载:" + drawable.toString());

			} catch (IOException e) {

				Log.e(TAG, e.toString() + "图片下载及保存时出现异常!");

			}

		} else {

			drawable = Drawable.createFromPath(file.toString());

			Log.i("test", "file.tostring():" + file.toString());

			Log.i("test", "file.exists()文件存在,本地获取:" + drawable);

		}

		return drawable;

	}

下面是输出:

============解决方案1============

引用 4 楼 u014274707 的回复:

Quote: 引用 3 楼 svenwang 的回复:

Quote: 引用 2 楼 u014274707 的回复:

Quote: 引用 1 楼 svenwang 的回复:

你的问题是这么产生的:

1.第一次调用函数,因为在本地不存在,所以去网络下载。

2.因为你在UI线程中访问网络,所以导致异常,并在本地生成一个长度为0的空文件。

3.第二次调用函数,因为本地文件存在,所以执行的是else分支

4.因为文件内容为空,所以Drawable.createFromPath返回null

解决方法:

1.不要在UI线程中下载文件。

2.下载文件发生异常时删除残留文件。

可问题是我并没有在UI线程里下载啊,logcat里也没有报exception,我是在线程池里调用上面的方法的。如下:

	executor = new ThreadPoolExecutor(1, 50, 180, TimeUnit.SECONDS, queue);

// 用线程池来做下载图片的任务

		executor.execute(new Runnable() {

			@Override

			public void run() {

				Drawable drawable = loadImageFromUrl(context, imageUrl);

				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));

				Message message = handler.obtainMessage(0, drawable);

				handler.sendMessage(message);

			}

		});

那可能是下载失败导致本地文件内容不完整导致的。你可以检查一下/data/data/com.roy.activity/cache/test01_upload_1.jpg

这个文件。

下载失败的原因是什么?我该怎么做才能让图片正确显示呢?

你是不是检查了本地的/data/data/com.roy.activity/cache/test01_upload_1.jpg文件有问题?

因为网络原因下载中断或失败是很常见的事情,具体的原因要看异常里的信息。

时间: 2024-12-25 05:54:44

android图片下载问题的相关文章

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

Android 图片下载

Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载 Universal Image Loader https://github.com/nostra13/Android-Universal-Image-Loader Square`s newer Picasso https://github.com/square/picasso Android 图片下载,布布扣,bubuko.com

Android图片下载以及缓存框架

实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生HttpURLConnection和AsyncTask等操作来完成,但并不推荐,因为这样不仅需要我们编写大量的代码, 还需要处理缓存和下载管理等,最好自己封装成库或者采用第三方库: 使用HttpUrlConnection和AsyncTask实现远程图片下载: 使用HttpUrlConnection和

picasso-强大的Android图片下载缓存库

编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能.仅仅只需要一行代码就能完全实现图片的异步加载: Picasso.with(context).load("http://i.imgur.com/

picasso_强大的Android图片下载缓存库

picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能.仅仅只需要一行代码就能完全实现图片的异步加载: 1 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); Api看起来非常独特,是吧. Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决

Android图片下载到本地,系统图库不显示

可能大家都知道我们下载图片到Android手机的时候,然后调用系统图库打开图片,提示"找不到指定项". 那是因为我们插入的图片还没有更新的缘故,所以只要将图片插入系统图库,之后发条广播就ok了. /** * 图片插入到系统相册,解决系统图库不能打开图片的问题 */ public static void insertImageToSystemGallery(Context context, String filePath, Bitmap bitmap){ MediaStore.Image

详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)

内存缓存的扩展还是蛮重要的,无论是数据结构还是具体的实现还是值得我们进行细细的品味,下面咱们就一起能品味这里面的趣味吧. 内存缓存的扩展主要学习下面的几个类:FIFOLimitedMemoryCache.FuzzyKeyMemoryCache. LargestLimitedMemoryCache.LimitedAgeMemoryCache.LRULimitedMemoryCache. LruMemoryCache.UsingFreqLimitedMemoryCache以及WeakMemoryCa

具体解说Android图片下载框架UniversialImageLoader之内存缓存(三)

前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是解说一下内存缓存.对于内存缓存.也打算分两篇文章来进行解说.在这一篇文章中,我们主要是关注三个类, MemoryCache.BaseMemoryCache以及LimitedMemoryCache. 首先我们先看一下内存缓存的接口MemoryCache. put(String key, Bitmap value); Bitmap get(String key); Bitmap remove(String key); Collection<Strin

详细讲解Android图片下载框架UniversialImageLoader之内存缓存(三)

前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是讲解一下内存缓存.对于内存缓存,也打算分两篇文章来进行讲解.在这一篇文章中,我们主要是关注三个类, MemoryCache.BaseMemoryCache以及LimitedMemoryCache. 首先我们先看一下内存缓存的接口MemoryCache. [java] view plaincopyprint? put(String key, Bitmap value); Bitmap get(String key); Bitmap remove(S