-
解析JSON数据到List集合中查看全部
-
android异步加载查看全部
-
为什么要实行异步加载查看全部
-
异步加载——图片加载优化 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不在缓存时,也不去加载图片查看全部
-
异步加载——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查看全部
-
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图文混排逻辑总结 第一步 onCreate中new一个NewsAsyncTask 将url传递给getJsonData 实现异步访问 第二步 getJsonData将url转换为NewsBean对象 第三步 onPostExecute讲NewsBean的数据传递给NewsAdapter 第四步 NewsAdapter构造一个ListView数据源 并将数据源设置给ListView查看全部
-
文艺方式重现BaseAdpter 1、自定义Adpter继承BaseAdpter; 2、定义变量:List<NewsBean>;LayoutInflater; 3、重写构造函数NewsAdpter(Context context, List<NewsBean> data)。 4、文艺方式重写getView()方法。 4.1、自定义类ViewHolder,映射相关的view对象查看全部
-
异步加载 1. 主线程中不能做耗时操作,只能更新UI 下面的例子 2. 获取jsonData url = http://www.imooc.com/api/teacher?type=4&num=30 下面的openStream参数是从URL参数中new URL(url).openStream()获取的。 private String readStream(InputStream openStream) { InputStreamReader isr; String result = ""; try { String line = ""; //将InputStream类的字节流转换成字符流 isr = new InputStreamReader(openStream, "utf-8"); //转存在BufferedReader中 BufferedReader br = new BufferedReader(isr); while((line = br.readLine())!=null) { result+=line; } } return result; } 3. 解析json数据到List<NewsBean>中 (如图),通过如下for循环就可以将jsonString原始字符数据导入到每个NewsBean对象中。 for (int i = 0; i<jsonArray.length(); i++) { jsonObject = jsonArray.getJSONObject(i); newsBean = new NewsBean(); //从jsonObject中得到每个元素数据给newsBean newsBean.image = jsonObject.getString("picSmall"); newsBean.title = jsonObject.getString("name"); newsBean.content = jsonObject.getString("description"); newsBeanList.add(newsBean); } 最后通过newsBeanList.add(newsBean)组成一个List<NewsBean>对象,这是构成Adapter适配器的原始数据查看全部
-
利用异步加载来实现json格式的获取: 首先定义异步加载类来获取json数据 jsonString数据的获取需要用到InputStream 构造ReadStream(InputStream is )得到String 数据 传给jsonString : 1、InputStremReader 读取 InputStream 2、转为BufferedStream 便于修改 3、逐行读取数据line = br.readline() 只要 line !=null -->result +=line 4、return result 获取到的json数据封装成Bean格式之后再传给Adapter(下一节)查看全部
-
使用异步加载的原因: 1.android单线程模型 2.耗时操作阻塞UI线程 异步加载最常用的两种方式: 1.多线程\线程池 2.AsyncTask查看全部
-
Android异步加载查看全部
-
Android异步加载查看全部
-
1.安卓的单线程模式决定非主线程是不能够在线程中直接去编程UI的,只能通过Handler去传递消息机制查看全部
-
Android异步加载查看全部
举报
0/150
提交
取消