-
Android异步加载的总结。除了LruCache,我们还可以使用DiskLruCache这个第三方的类来实现“二级缓存”。异步加载不仅仅是获取网络资源,我们可以加所有耗时的操作都看成异步加载,所有通过耗时的操作获取的结果我们都可以通过缓存来提高效率,比如我们可以利用这里的LruCache和DiskLruCache(这个缓存一般是用于缓存从网络获取的图片,视频等大的资源,这个时候我们一般和LruCache结合使用),使用Cache有个缺点,就是我们不能保证我们的数据是实时的,所以在realtime需求高的应用中,我们不应该使用缓存。而对于本地资源,我们很少用缓存的,就算是操作SQLite数据库,我们也很少会用到LruCache,但是也有使用的。查看全部
-
setTag(url)作为标示,避免异步加载图片信息错乱查看全部
-
Android异步加载查看全部
-
我运行我的程序的时候崩溃了!哈哈!找了一下Bug,才发现我的图片URL不唯一(我没有使用慕课网的API,使用的自己搭建的简单后台,因此图片大都是重复的)。本节教程使用URL作为ListView中每一个Item中ImageView的唯一标识,那么当使用findViewByTag(url)的时候就会返回空。因此程序在第一次加载的时候不会设置图片,接下来滚动的时候就会出现空指针异常! imageView = (ImageView) mListView.findViewWithTag(url); Log.e("info", url + " imageView value " + imageView); 输出结果为: http://192.168.0.103:8080/Umooc/Image/1.png imageView value null 07-16 19:00:56.636 1761-1761/xq.listviewdemo E/info: http://192.168.0.103:8080/Umooc/Image/2.jpg imageView value null 07-16 19:00:56.636 1761-1761/xq.listviewdemo E/info: http://192.168.0.103:8080/Umooc/Image/1.png imageView value null 07-16 19:00:56.636 1761-1761/xq.listviewdemo E/info: http://192.168.0.103:8080/Umooc/Image/2.jpg imageView value null 解决办法:不再使用FindViewWithTag获取ImageView.而是获取Adapter中的ViewHolder中的ImageView. View view = getView(position, null, null); ViewHolder viewHolder = (ViewHolder) view.getTag();查看全部
-
android异步加载查看全部
-
当我们将加载图片的控制权交给了onScrollStateChanged()这个回调函数之后,我们会遇到一个问题,当程序刚启动的时候,我们的图片是不会被加载的,原因在于一开始的时候onScrollStateChanged()这个回调函数是不会被调用的,所以我们需要对开始的图片进行“预加载”。 我们将“预加载”放在onScroll方法中去进行,因为这个回调会在ListView启动和绘制的时候被多次调用。为了保证我们的图片加载是在ListView被绘制出来之后进行的,我们需要判断visibleItemCount这个参数是否大于0。查看全部
-
ImageAdapter中implement ListView.onScoll...Listen..{//需要绑定自己的滚动监听事件 listView.setOnScoll...(this); onScollStatuChage(){//每次滚动时状态发生改变调用 //加载start到end的图片 //取得之间的图片url使用sync..Task去下载 并将task保存到Set<SyncTask>中,便于滚动时cancel()所有的下载,ImageView通过ListView.findViewWithTag(url)获取(在baseAdapter中设置过了,所以可以取到); } onScoll(){//每次滚动都会执行 //获取第一个和最后一个的num位置 } } 在syncTask的onPost..(){ //在最后显示图片后需要移除Set中的此对象 set<SyncTask>.remove(this); }查看全部
-
异步加载——图片加载优化 1. 创建一个静态String[]将所有要显示的图片的地址保存起来 public static String[] URLStrings;//用来保存当前所有需要显示的图片的url地址 public NewsAdapter(Context context, List<NewsBean> mListData) { super(); this.mList = mListData; mInflater = LayoutInflater.from(context); mImageLoader = new ImageLoader(); URLStrings = new String[mListData.size()]; for (int i = 0; i<mListData.size(); i++){ URLStrings[i] = mListData.get(i).imageUrl; }} 2. 创建一个方法,加载从start到end的所有图片 public void loadImages(int start, int end){ for (int i = start; i < end; i++){ //因为URLStrings是静态的,所以可以直接使用 String url = NewsAdapter.URLStrings[i]; //从缓存中获取对应的图片并判断 Bitmap bitmap = getBitmapFromCache(url); if(bitmap == null){ NewsAsyncTask task = new NewsAsyncTask(url); task.execute(url); mTasks.add(task); }else { //从缓存中直接获取数据让iamgeView显示,这里imageView是从url的tag得来的 ImageView imageView = (ImageView) mListView.findViewWithTag(url); imageView.setImageBitmap(bitmap); }}} 3. 改写showImageByAsyncTask(),让显示图片的操作交给scroll的监听事件 (如图) 当bitmap不在缓存时,也不去加载图片查看全部
-
1.声明lruCache LruCache<String,Bitmap> string是图片名字,Bitmap是图片对象 2.获取最大可用内存,将一部分内存作为缓存,创建lruCache ,重写sizeOf方法,返回图片大小,在每次存入缓存的时候调用 3.创建方法存放图片到缓存和从缓存中取出图片 4.在主线程中判断图片是否存在缓存中,如果不存在异步加载图片,存在则直接使用 5.在doInBackground方法中,从网络上获取图片,将不在缓存中的图片加入缓存 这样做,可以把下载的图片放入缓存,在刷新列表的时候不用每次都去加载图片,做到了以内存换效率查看全部
-
异步加载——LruCache缓存 (接上一笔记) (3)改写showImageByAsyncTask()和doInBackground() bitmap不在缓存中时才下载;下载完之后保存在cache中。 public void showImageByAsyncTask(ImageView imageView, String url){ //从缓存中获取对应的图片并判断 Bitmap bitmap = getBitmapFromCache(url); if(bitmap == null){ new NewsAsyncTask(imageView, url).execute(url); }else { //从缓存中直接获取数据让iamgeView显示 imageView.setImageBitmap(bitmap); } } protected Bitmap doInBackground(String... params) { String url = params[0]; Bitmap bitmap = getBitmapFromURL(url); if(bitmap!=null){ addBitmapToCache(url, bitmap); } return bitmap; } (4)最后要在创建Adapter对象时给ImageLoader的对象初始化,直接使用该对象。这样不会每次都创建LruCache。 public NewsAdapter(Context context, List<NewsBean> mListData) { super(); this.mList = mListData; mInflater = LayoutInflater.from(context); mImageLoader = new ImageLoader(); } //通过AsyncTask执行显示ImageView额操作 mImageLoader.showImageByAsyncTask(viewHolder.imageView, urlString);查看全部
-
异步加载——LruCache缓存 1. Lrc——Least Recently Used,LruCache类来实现缓存算法。 LruCache类将内容保存在内存中,并以一定的方法管理这些内容,来实现缓存管理。 2. LrcCache本质是一个Map,底层是通过HashMap实现的。 所以在使用LruCache时可以通过调用set()和get()方法使用。 3. 使用步骤: (1)先创建一个LruCache,并在构造函数中初始化它。 注意:通过匿名内部类的方式实现sizeOf()方法,sizeOf()方法用来获取每次缓存的对象的大小,默认返回元素的个数。sizeOf()方法在每次元素加入缓存时调用。 private LruCache<String, Bitmap> mLruCache; public ImageLoader() { //通过Runtime类获取运行时最大内存 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory/4; mLruCache = new LruCache<String, Bitmap>(cacheSize){ protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); }};} (2)两个set()和get()方法,分别是加入元素到缓存以及从缓存中获取数据 public void addBitmapToCache(String url, Bitmap bitmap){ if(getBitmapFromCache(url)==null){ mLruCache.put(url, bitmap); } } public Bitmap getBitmapFromCache(String url){ return mLruCache.get(url); } (3)改写showImageByAsyncTask()和doInBackground() (如图)bitmap不在缓存中时才下载;下载完之后保存在cache中。 (4)最后要在创建Adapter对象时给ImageLoader的对象初始化,直接使用该对象。这样不会每次都创建LruCache查看全部
-
1. 对于从网络上获取图片这种需求,我们都要使用Cache来将我们的图片缓存起来,尤其是对于ListVIew这种,不能每次我们滑动ListView就重新从网上下载图片,这样会很浪费资源而且浪费手机的流量。在Android中,已经为我们提供了一个用于缓存的类LruCache。我们可以使用这个类来实现我们对于图片资源的缓存。 2. LruCache是将图片缓存在内存中,而还有个第三方的类DiskLruCache来将图片缓存到手机的Disk上,而我们大型的app,一般都是将LruCache和DiskLruCache结合起来使用,形成一个memory hierarchy。 LruCache<String,Object>近期最少使用算法:步骤:可以放到构造器中进行初始化,1,获取运行时最大内存,2计算出内存1/4的大小初始化给缓存的大小new LruCache<>(内存的大小){ //每次存入到缓存的时候调用 sizeOf(String key,Object value){ return value.getBytesCount();//获取存的数据大小 } }查看全部
-
Android异步加载查看全部
-
Bitmap-刷新ListView加载: 问题是解决:缓存的图片对正确的图片加载时的影响~ 问题描述:图片在刷新显示的时候会刷新更改多次,并不是一次到位加载正确图片。 问题分析:ListView会重用convertView,每一个ImageView并没有唯一的标识,多个LIstView中Item的加载在缓冲池中产生多个ImageView,在没有Tag的情况下,重用convertView就会导致新的图片在加载之前先显示旧的图片,根本原因是ListView中特定的Item没有显示正确的URL资源 解决方案:方法1-设置Tag:在首次加载时就为ImageView的标签,标签为正确的URL(身份验证信息):viewHolder.imageView.setTag(url),在handler中加载图片时对标签进行判断,若符合,则加载。 方法2-设置成员变量:在showImageByThread中仿照ImageView的方式对URL进行缓存,避免了网络下载时间不确定导致的持续性的混乱 在异步加载中,当网络环境不是很好情况下,ListView本身的缓冲机制可能会造成ListView的item显示错乱。 两种方法可以避免这种问题: 1. 将当前的item与原始数据绑定 例如上一笔记中,在Adapter的getView()方法中为每个ImageView设置一个url的tag String urlString = newsBean.imageUrl; viewHolder.imageView.setTag(urlString); 在主线程的Handler中真正加载进行更新UI时,会判断这个tag是否是对应的。只有当tag是正确时才会真正做设置item的操作 if(mImageView.getTag().equals(urlString)) mImageView.setImageBitmap((Bitmap) msg.obj); 2. 使用成员变量将对应的数据进行缓存,这种方式就相当于BaseAdapter中使用ViewHolder是一样的。查看全部
-
inputStream in = new BufferedinputStream(conn.getInputStream()); inputStream是个抽象类,通过实例化子类获取BufferedinputStream的对象。 抽象类 URLConnection 是所有表示应用程序与 URL 之间通信链路的类的超类。该类的实例可以用来对由 URL 引用的资源进行读取和写入操作,HttpURLConnection是支持 HTTP 特定功能的 URLConnection 实现异步加载(加载图片)的两种方式:多线程(Handler)和AsyncTask查看全部
举报
0/150
提交
取消