android Picasso如何监听图片加载完成

android Picasso如何监听图片加载完成,第1张

优秀的加载框架不要太多,什么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中异步加载视频缩略图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9472301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存