优秀的加载框架不要太多,什么UIL , Volley ,Picasso,Imageloader等等。但是作为一名合格的程序猿,必须懂其中的实现原理,于是乎,今天我就带大家一起来设计一个加载网络、本地的框架。有人可能会说,自己写会不会很渣,运行效率,内存溢出神马的。放心,我们拿demo说话,拼得就是速度,奏事这么任性。
好了,如果你看过之前的博文,类似Android Handler 异步消息处理机制的妙用 创建强大的加载类,可能会对接下来文章理解会有很大的帮助。没有的话,就跟我往下继续走吧,也不要去看了。
关于加载本地,当然了,我手机比较少,7000来张:
1、首先肯定不能内存溢出,但是尼玛现在像素那么高,怎么才能保证呢?我相信利用LruCache统一管理你的是个不二的选择,所有的从LruCache里面取,保证所有的的内存不会超过预设的空间。
2、加载速度要刚刚的,我一用力,滑动到3000张的位置,你要是还在从第一张给我加载,尼玛,你以为我打dota呢。所以我们需要引入加载策略,我们不能FIFO,我们选择LIFO,当前呈现给用户的,最新加载;当前未呈现的,选择加载。
3、使用方便。一般都会使用GridView作为控件,在getView里面进行加载,当然了为了不错乱,可能还需要用户去自己setTag,自己写回调设置。当然了,我们不需要这么麻烦,一句话IoadImage(imageview,path)即可,剩下的请交给我们的加载框架处理。
做到以上几点,关于本地的加载应该就木有什么问题了。
关于加载网络,其实原理差不多,就多了个是否启用硬盘缓存的选项,如果启用了,加载时,先从内存中查找,然后从硬盘上找,最后去网络下载。下载完成后,别忘了写入硬盘,加入内存缓存。如果没有启用,那么就直接从网络压缩获取,加入内存即可。
附上出处链接:>
你说的顺序加载我不是很理解,单线程异步能够保证。多线程的话,会根据缩略图大小先后顺序显示出来。排列的位置与你传入的String数组是对应的顺序。所以不理解你说的顺序,是要求加载显示顺序还是什么?
另外加载不出来的,要看你使用的何种方法去读取缩略图了,我这边大概用过5种方式去读取,各有差异性。有些方法获取的bitmap为空,需要判断使用一张去替代。
建议:下载一个gallery2系统源码,仔细研究下,里面的方法值得你借鉴。需要达到加载速度更优,也可以考虑使用java的缓存方法。或者你可以自己发现一些比较好的方法,例如使用自定义回调监测多线程的加载状态。
先初始化;
注意自定义 的
private final String IMAGE_TYPE = "image/";private final int IMAGE_CODE = 0;
private void setImage() {
Intent getAlbum = new Intent(IntentACTION_GET_CONTENT); getAlbumsetType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE);}
这里使用Intent获得相册数据,并返回原来界面;
这里说明一下
startActivityForResult(getAlbum, IMAGE_CODE);
补充{
startActivityForResult与startActivity的不同之处在于:
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。
}
startActivityForResult(getAlbum, IMAGE_CODE);
这里采用startActivityForResult来做跳转,此处的IMAGE_CODE实质是0为一个依据,可以写其他的值,但一定要>=0
然后重写onActivityResult用于接收刚刚得到的数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = datagetData(); bm = MediaStoreImagesMediagetBitmap(resolver, originalUri); imgShowsetImageBitmap(bm); } catch (IOException e) {
eprintStackTrace(); }
}
补充{
ContentProvider-----数据提供给第三方应用程序使用时使用
因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其他应用程序的数据。如果你想公开你自己的数据,你有两个选择:你可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限
}
这里是创建一个新的内容提供器,然后在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例
if (requestCode == IMAGE_CODE) {
resultCode为回传的标记这句话是在确认是否回传的是你所需要的;如果是就执行try;不然就执行catch (IOException e) {
eprintStackTrace();}先说这里当try语句中出现异常是时,会执行catch中的语句,IOException e也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了eprintStackTrace() ;。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
try {
Uri originalUri = datagetData(); bm = MediaStoreImagesMediagetBitmap(resolver, originalUri); imgShowsetImageBitmap(bm);接收数据处理数据并显示照片。
然后进行测试。
另附源码:
MainActivity:
package comexampleadministratormyapplication1;import androidgraphicsBitmapFactory;import androidsupportv7appAppCompatActivity;import androidosBundle;import javaioIOException;import androidnetUri;import androidosBundle;import androidproviderMediaStore;import androidappActivity;import androidcontentContentResolver;import androidcontentIntent;import androidgraphicsBitmap;import androidviewView;import androidviewViewOnClickListener;import androidwidgetButton;import androidwidgetImageView;public class MainActivity extends AppCompatActivity { private final String IMAGE_TYPE = "image/"; private final int IMAGE_CODE = 0; private Button choose=null; private ImageView imgShow; @Override protected void onCreate(Bundle savedInstanceState) { superonCreate(savedInstanceState); setContentView(Rlayoutactivity_main); init();} private void init() { choose=(Button) findViewById(Ridbutton1); imgShow=(ImageView) findViewById(RidimgShow); choosesetOnClickListener(listener); } private OnClickListener listener=new OnClickListener(){ @Override public void onClick(View v) {
setImage(); }
}; private void setImage() {
Intent getAlbum = new Intent(IntentACTION_GET_CONTENT); getAlbumsetType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = datagetData(); bm = MediaStoreImagesMediagetBitmap(resolver, originalUri); imgShowsetImageBitmap(bm); } catch (IOException e) {
eprintStackTrace(); }
}
}
}
layout:activity_mainxml:
<xml version="10" encoding="utf-8"><LinearLayout xmlns:android=">
以上就是关于android Picasso如何监听图片加载完成全部的内容,包括:android Picasso如何监听图片加载完成、android 获取的图片尺寸比图片属性显示的尺寸大很多、android LitsView中异步加载视频缩略图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)