-
1. 对于从网络上获取图片这种需求,我们都要使用Cache来将我们的图片缓存起来,尤其是对于ListVIew这种,不能每次我们滑动ListView就重新从网上下载图片,这样会很浪费资源而且浪费手机的流量。在Android中,已经为我们提供了一个用于缓存的类LruCache。我们可以使用这个类来实现我们对于图片资源的缓存。 2. LruCache是将图片缓存在内存中,而还有个第三方的类DiskLruCache来将图片缓存到手机的Disk上,而我们大型的app,一般都是将LruCache和DiskLruCache结合起来使用,形成一个memory hierarchy。查看全部
-
什么是异步加载:就是用异步的方式去加载数据 使用异步加载的原因 1.android是单线程模型 2.耗时操作都必须放在单独的线程中去做,而不能去阻塞UI线程 异步加载最常用的两种方式 1.多线程\线程池 2.AsyncTask(底层也是基于线程池来实现的)查看全部
-
刷新混乱的问题问题是由于快速滚动时,同一个位置的item可能被设置了多次图片显示。 而由于线程是异步的,导致后面会有多个线程在跑。 第一次测试的线程还没有跑完,第二次的线程又开始了。 所以同一个位置会被设置多次图片。 设置了tag之后,之后一次设置的tag会和item绑定。 所以第一次的线程跑完设置图片的时候,tag已经更新为新的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是一样的。查看全部
-
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进行缓存,避免了网络下载时间不确定导致的持续性的混乱查看全部
-
抽象类 URLConnection 是所有表示应用程序与 URL 之间通信链路的类的超类。该类的实例可以用来对由 URL 引用的资源进行读取和写入操作,HttpURLConnection是支持 HTTP 特定功能的 URLConnection查看全部
-
inputStream in = new BufferedinputStream(conn.getInputStream()); inputStream是个抽象类,通过实例化子类获取BufferedinputStream的对象。查看全部
-
加载图片的两种方式:多线程;异步加载查看全部
-
异步加载的第一层:通过AsyncTask访问网络,获取json或者XML字符串,然后解析他们产生若干object,将每个object放入到ListVIew中(adapter需要使用view holder pattern去写),AsyncTask中的访问网络获取json或者XML字符串,并且产生若干个object的工作就是在doInBackground()方法中进行的,所以这个方法总的来说就是用来准备数据源的。查看全部
-
异步加载——实现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对象查看全部
-
3. 解析json数据到List<NewsBean>中 jsonobject=new JsonObject(jsonString); jsonArray=jsonobject.getjsonArray("data"); NewsBean 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适配器的原始数据。查看全部
-
异步加载 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; }查看全部
-
Message messages= new Message(); Message message=Message.obtain(); message.obj=bitmap; 一个始终创建新的对象、一个是只创建一个、一个用完返回一个新的对象、比较节省内存查看全部
-
一、如何通过Url获取网络反馈的Json字符串结果: 1、重写doInBackground(Params…) 获取请求的网址,调用自定义方法getJson(String url); 2、自定义方法getJson中定义URL,获取inputStream流 3、自定义方法readStream(InputStream is),将inputStream流中的字节流拼装成字符串; 4、自定义方法getJson调用readeStream()方法,并将InputStream流作为参数传递。这样既可获得json串结果。查看全部
举报
0/150
提交
取消