博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android图片下载问题
阅读量:5150 次
发布时间:2019-06-13

本文共 2706 字,大约阅读时间需要 9 分钟。

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

哪位大神帮我看看下面的代码,为什么传入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)); 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文件有问题?
因为网络原因下载中断或失败是很常见的事情,具体的原因要看异常里的信息。

转载于:https://www.cnblogs.com/yiguobei99/p/4035709.html

你可能感兴趣的文章
张瀚荣 如何用UE4制作3D动作游戏
查看>>
SQL ALTER TABLE 语句在项目中的使用
查看>>
【笔记篇】斜率优化dp(二) SDOI2016征途
查看>>
pairwork2测试作业
查看>>
理解之通用的重定向方法
查看>>
Collection接口这样学不迷路!(List、Set、SortedSet、Queue)第二篇
查看>>
设置myeclipse新建jsp文件默认编码为UTF-8
查看>>
indeed招聘
查看>>
一分钟秒解数据库三大范式
查看>>
硬盘全文检索工具
查看>>
【设计模式】单例模式学习总结
查看>>
子类调用父类的事件
查看>>
uboot 的内存命令使用 mw (修改) md (显示)
查看>>
Linux性能测试 mpstat命令
查看>>
关于语言
查看>>
12th week blog
查看>>
入住cnblogs,以后会常来
查看>>
xdebug 显示数组深度 netbeans配置Xdebug
查看>>
Wireshark过滤总结
查看>>
洛谷 P2256 一中校运会之百米跑
查看>>