为了账号安全,请及时绑定邮箱和手机立即绑定

Android必学-异步加载

难度中级
时长 1小时57分
学习人数
综合评分9.70
220人评价 查看评价
9.9 内容实用
9.7 简洁易懂
9.5 逻辑清晰
  • 使用异步加载的原因 1.android单线程模型 2.耗时操作阻塞UI线程 异步加载最常用的两种方式 1.多线程\线程池 2.AsyncTask
    查看全部
  • From @xiaoc024 我来说一下为什么会闪。这是【同时】使用ConvertView和异步机制造成的。一个屏幕一次显示8个item,当第9个item划进屏幕时,ListView对adapter说,返给我一个view,我要显示。adapter调用getView()方法,由于使用了缓存机制,getView()在初始化8个item以后所有返回的view(ConvertView)内存地址都是这8个中的。如果【不使用】异步机制加载图片,那么返回的这个ConvertView是被更新以后返给ListView使用的。效果是上滑屏幕没反应,等了半天,突然加载出来,但是不会闪。 然而这里使用了异步机制,也就是说先返回ConvertView,再等异步线程修改,这是闪的本质!由于教程里使每个异步线程人工阻塞了1s,那么上来有8个异步线程在运行(编号1-8),如果1s之内下滑了ListView比如说下滑了8个,那么新更新的8个item还是用的以前的内存,【并且】又开启了8个异步线程(编号9-16)。因为预先设定了一个默认图片,所以先显示绿色的默认icon图片。然后1-8号异步线程运行完毕,更新ImageView(闪),紧跟着9-16异步线程运行完毕,又更新imageView(闪),最终显示正确结果。这就是下滑时先显示默认图片,再闪一下错误图片,最后闪一下正确图片的本质过程。 如果给每个ImageView设置了tag以后,当1-8号异步线程运行完毕后,会发消息给handler,让他进行更新ui的操作,可是在1-8号线程发消息之前,9-16号线程已经更新了1-8和9-16共用的ImageView控件的tag,所以1-8号线程的消息虽然发给了handler,但是不满足条件,handler不会进行ui更新。 p.s.完全理解这整个过程真的不容易,希望对你们有帮助。 至于说“然而如果不显示ic_lanucher的话,图片依然会错误跳动”其实这个时候图片不是在跳动,而是正在做加载的工作,只是在加载工作完成之前,依然会显示先前加载的图片。 比如1-8加载完成了,我要查看第9个项目,系统就将第1个项目放入缓存,然后加载第9个,然而加载第1个需要时间,系统就会默认地使用最近加入缓存的对象,也就是第1个项目的图片先抗一会,等待第1个项目加载完成接手。 这应该是convertView的小弊端
    查看全部
    7 采集 收起 来源:使用Thread

    2016-10-04

  • 异步加载——图片加载优化 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不在缓存时,也不去加载图片
    查看全部
    6 采集 收起 来源:图片加载优化

    2018-03-22

  • listview的优化 1. 复用convertView,减少item view 的加载次数 2.使用holder,减少获取item中子控件的次数 3.使用异步加载,防止阻塞主线程 4.使用google提供的LruCache类,将图片缓存到内存中,减少从网络获取图片的次数 加快速度,节省流量。lru 算法 5. 防止图面缓存引起的错位问题,给每个imageView添加一个tag,用URL做标识,加载图片时 只有当前的URL和要加载图片的imageView的tag中的URL相同时,才加载. 6.监听listView的滚动状态。滚动时停止记载,记录当前可见item的起始和结束位置,并记录他们的url,滚动结束后载再加载。 防止滑动中加载数据造成卡顿,和不必要的流量浪费.
    查看全部
    6 采集 收起 来源:总结

    2015-05-29

  • @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // 滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 // firstVisibleItem:当前能看见的第一个列表项ID(从0开始) // visibleItemCount:当前能看见的列表项个数(小半个也算) // totalItemCount:列表项共数 mStart = firstVisibleItem; mEnd = firstVisibleItem + visibleItemCount; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // 正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调 // 回调顺序如下 // 第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 // 第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) // 第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动 // 当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1; // 由于用户的操作,屏幕产生惯性滑动时为2 // 当滚到最后一行且停止滚动时,执行加载 if (scrollState == SCROLL_STATE_IDLE) { // 加载可见项 } // 停止任务 }
    查看全部
  • 刷新混乱的问题问题是由于快速滚动时,同一个位置的item可能被设置了多次图片显示。 而由于线程是异步的,导致后面会有多个线程在跑。 第一次测试的线程还没有跑完,第二次的线程又开始了。 所以同一个位置会被设置多次图片。 设置了tag之后,之后一次设置的tag会和item绑定。 所以第一次的线程跑完设置图片的时候,tag已经更新为新的url了,所以本次设置图片就放弃了。
    查看全部
    2 采集 收起 来源:使用Thread

    2015-09-24

  • 异步加载——实现ListView图文混排逻辑总结 第一步 onCreate中new一个NewsAsyncTask 将url传递给getJsonData 实现异步访问 第二步 getJsonData将url转换为NewsBean对象 第三步 onPostExecute讲NewsBean的数据传递给NewsAdapter 第四步 NewsAdapter构造一个ListView数据源 并将数据源设置给ListView
    查看全部
    2 采集 收起 来源:逻辑梳理

    2015-09-20

  • http://www.imooc.com/api/teacher?type=4&num=30
    查看全部
    2 采集 收起 来源:AsyncTask分析

    2018-03-22

  • 练习URL地址: http://www.imooc.com/api/teacher?type=4&num=30
    查看全部
    2 采集 收起 来源:获取Json数据

    2018-03-22

  • 我跟着吧代码打完了发现最后图片没显示出来,后来又看了一遍视频,确认没少敲代码,但还是显示不出来,郁闷,不知道哪里错了。
    查看全部
    2 采集 收起 来源:总结

    2015-06-20

  • 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进行缓存,避免了网络下载时间不确定导致的持续性的混乱
    查看全部
    2 采集 收起 来源:使用Thread

    2015-06-04

  • 强哥不错不错哈
    查看全部
  • 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进行缓存,避免了网络下载时间不确定导致的持续性的混乱
    查看全部
    1 采集 收起 来源:使用Thread

    2016-08-29

  • http://www.imooc.com/api/teacher?type=4&num=30
    查看全部
    1 采集 收起 来源:AsyncTask分析

    2018-03-22

  • 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进行缓存,避免了网络下载时间不确定导致的持续性的混乱 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
    1 采集 收起 来源:使用Thread

    2016-08-26

首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
1、了解异步处理的一般方法 2、掌握如何使用多线程进行异步加载 3、掌握如何使用ASyncTask进行异步加载 4、异步加载的缓存与优化
老师告诉你能学到什么?
本课程是Android中级课程 1、熟练掌握基本的Android应用程序开发方法

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!