解析Json数据,用什么安卓第三方数据库库,方便一点的,最好有demo

1273人阅读
推荐网站、书籍、文章、第三方(72)
大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式。一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特定的数据结构,必须对其进行解析,得到我们可以处理的数据。所谓“解析”,就是从事先规定好的格式串中提取数据。解析的前提是数据的提供方与获取方提前约定好格式,数据提供方按照格式提供数据,数据获取方按照格式获取数据。
iOS开发中,几乎只要是与网络相关的应用,都离不开对网络数据的解析与应用。现总结几种常用方式来解析网络数据:
Json格式:
NSJSONSerialization,官方提供的Json数据格式解析类,iOS5以后支持JSONKit(第三方类库)SBJsonTouchJson
XML格式:
NSXMLParse,官方自带GDataXML,Google提供的开元XML解析库
按照目前的发展,Json正在逐步取代XML成为网络数据的通用格式,所以我们重点来看Json格式的数据解析先。
在看如何使用Json和XML之前,我们还有些事情要做,一是准备我们要解析的数据,二是搭建一个界面来看实际效果,毕竟我们解析了数据就是要在应用中展示出来的。
Json数据准备
关于如何获取网络的数据在这里就不多赘述了,你只需要获得一个从网站为开发者提供的API接口中获得我们想要的url就好了。我这里调用了豆瓣电影的API,随便选了在豆瓣电影首页的电影——《前任2:备胎反击战》,来看看豆瓣对这部电影的描述,由于标签太多,我这里只打算从中获取电影名称,体裁和剧情简介三部分打印出来。
我们可以先提前在浏览器中打开看一下这个待会我们将要得到的东西:
是不是很乱。。。没错,网站返回的东西虽然看上去好像有点规律,但是还是难以辨别,这里不用担心,我们可以使用一个叫做的东西来优化一下它的显示,这里有一个在线的。我们把网站返回给我们的数据copy到这里,点击校验,如果没有什么问题的话,为了方便展示,我把它copy到了Sublime中,我们看一下结果你会发现它变成了下面这个样子,这样看起来就舒服多了,我们也可以非常清楚地看到每一对“Key——Velue”对,以及每个Velue的类型,弄清楚了,待会儿方便我们查询和显示。
找到了目标,下一步我们先做个界面的模子出来,展示我们解析过的数据。大概就是下面这个样子,点击不同的按钮,可以以不同的方式解析获得的数据并在TextView中打印。
界面搭好之后不要忘了关联到代码。
XML数据准备
我们在项目中新建一个xml文件,编写其中的内容,待会儿解析内容并打印到TextView。
XML内容为Person,有几个学生的信息,包括学号,姓名,性别和年龄,一会儿根据这些创建模型。
NSJSONSerialization
接下来就正式开始。苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂。
首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要加载一个NSURL对象,来向网站提交一个Request。到这里需要特别注意了,iOS9的时代已经来临,我们先前在旧版本中使用的某些类或者方法都已经被苹果官方弃用了。刚刚我们向网站提交了一个Request,在以往,我们是通过NSURLConnection中的sendSynchronousRequest方法来接受网站返回的Response的,但是在iOS9中,它已经不再使用了。从官方文档中,我们追根溯源,找到了它的替代品——NSURLSession类。这个类是iOS7中新的网络接口,苹果力推之,并且现在用它完全替代了NSURLConnection。关于它的具体用法,还是蛮简单的,直接上代码(ViewController.m文件):
#import &ViewController.h&
@interface ViewController ()
@property (retain, nonatomic) IBOutlet UITextView *textV
@property (nonatomic, strong) NSMutableDictionary *
@property (nonatomic,strong) NSString *
@implementation ViewController
- (IBAction)NSJson:(UIButton *)sender {
dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q1, ^{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:
@&/v2/movie/subject/&]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,
&NSURLResponse * _Nullable response, NSError * _Nullable error){
self.dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSString *title = [self.dic objectForKey:@&original_title&];
NSMutableArray *genresArray = [self.dic objectForKey:@&genres&];
NSString *genres = [NSString stringWithFormat:@&%@/%@&, [genresArray objectAtIndex:0],
&[genresArray objectAtIndex:1]];
NSString *summary = [self.dic objectForKey:@&summary&];
self.text = [NSString stringWithFormat:@&电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@&, title, genres, summary];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = self.text;
[task resume];
还是要再提一下,因为涉及到了网络请求,我们在这里用了一点关于使用GCD实现多线程的内容,以后再专门介绍吧。我们运行程序,点击NSJSONSerialization按钮,就看到我们要的内容啦!
事实上上面的解析过程还是挺复杂的,主要是牵扯到了NSURLSession的使用。那接下来来看看一些第三方Json解析库的使用。SBJson用起来就简单多了。首先我们去下载这个类库,Github啊,CSDN啊,51啊哪里的任何一个地方都有,很好找。下载下来后导入我们的项目就可以直接运行了。有些第三方类库由于年代久远可能是不支持ARC的,SBJson还好,下面那个JsonKit可就不这么和谐了,这个待会再讲。我们这次点击第二个按钮来实现它。为了以示区分,这次我换了一部电影,来看看《移动迷宫2 Maze Runner:
The Scorch Trials》吧!
#import &ViewController.h&
#import &SBJson.h&
- (IBAction)SBJson:(UIButton *)sender {
dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q1, ^{
NSURL *url = [NSURL URLWithString:@&/v2/movie/subject/&];
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
SBJsonParser *parser = [[SBJsonParser alloc] init];
self.dic = [parser objectWithString:jsonString error:nil];
NSString *title = [self.dic objectForKey:@&original_title&];
NSMutableArray *genresArray = [self.dic objectForKey:@&genres&];
NSString *genres = [NSString stringWithFormat:@&%@/%@&, [genresArray objectAtIndex:0], [genresArray objectAtIndex:1]];
NSString *summary = [self.dic objectForKey:@&summary&];
self.text = [NSString stringWithFormat:@&电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@&, title, genres, summary];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = self.text;
看剧情好像很不错呢,打算去看一下~~
事实上,它虽然不支持ARC,但JsonKit是在性能上仅次于苹果原生解析器的第三方类库。我们在导入它的包以后编译会出现一大堆报错,这时候不用慌,我们会发现大部分是ARC的问题,解决方法也挺简单,我们进入项目的Target,找到Build Phases里面的Compile Sources,接着找我们的问题源头JsonKit.m,双击更改它的Compiler Flags标签为“-fno-objc-arc”,再次编译,就好啦~
#import &ViewController.h&
#import &JsonKit.h&
- (IBAction)JsonKit:(UIButton *)sender {
dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q1, ^{
NSURL *url = [NSURL URLWithString:@&/v2/movie/subject/&];
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
self.dic = [jsonString objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
NSString *title = [self.dic objectForKey:@&original_title&];
NSMutableArray *genresArray = [self.dic objectForKey:@&genres&];
NSString *genres = [NSString stringWithFormat:@&%@/%@&, [genresArray objectAtIndex:0], [genresArray objectAtIndex:1]];
NSString *summary = [self.dic objectForKey:@&summary&];
self.text = [NSString stringWithFormat:@&电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@&, title, genres, summary];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = self.text;
虽然我们只用了一个方法,但是这可不代表JsonKit类库里就只有这一个解析的方法,我们可以去看看它的源码来找寻一番。一般来讲,如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString方法,这个也比较简单。如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错,这时我们最好使用objectFromJSONStringWithParseOptions也就是我代码里使用的这个方法,因为电影体裁的Value是数组类型的。
这部电影叫《剩者为王》,好可怕。。。
来看看最后一个:
#import &ViewController.h&
#import &CJSONSerializer.h&
#import &CJSONDeserializer.h&
- (IBAction)TouchJson:(UIButton *)sender {
dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q1, ^{
NSURL *url = [NSURL URLWithString:@&/v2/movie/subject/&];
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
self.dic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:nil];
NSString *title = [self.dic objectForKey:@&original_title&];
NSMutableArray *genresArray = [self.dic objectForKey:@&genres&];
NSString *genres = [NSString stringWithFormat:@&%@/%@&, [genresArray objectAtIndex:0], [genresArray objectAtIndex:1]];
NSString *summary = [self.dic objectForKey:@&summary&];
self.text = [NSString stringWithFormat:@&电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@&, title, genres, summary];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = self.text;
《绝命海拔 Everest》,冒险类电影,本人不是很感冒,据说是根据真实事件改编的。
Json解析总结
呐,上述四种方式已经很清楚了,从代码量上来看,除了那些废话,原生的解析类库是实现起来最复杂的,其他三种倒是挺简单,通过封装,只对外提供一个简单地接口调用就能实现解析功能,性能上都还可以接受。不过从我亲身提回来讲,觉得JsonKit是里面最快的,可能是代码写的不够好,原生的解析方式如果好好优化一下的话应该是性能最好的。在实际的使用过程中选择一种方式就好。
NSXMLParse
关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象模型。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写)。苹果官方原生的NSXMLParse类库采用第一种方式,即SAX方式解析XML,它基于事件通知的模式,一边读取文档一边解析数据,不用等待文档全部读入以后再解析,所以如果你正打印解析的数据,而解析过程中间出现了错误,那么在错误节点之间的数据会正常打印,错误后面的数据不会被打印。解析过程由NSXMLParserDelegate协议方法回调。
插句题外话先,我在写这种方式解析XML数据的Demo时折腾了整整一天,说起来都有些不好意思了。程序运行的时候一直出现不能完成解析的情况,各种查各种试,真的是整了整整一天的时间。就在崩溃的边缘的时候,我竟然发现在我自己写XML文件时少写了一个“/。。。瞬间感觉整个世界都崩塌了。所以特地记下来警示自己也顺便给大家提个醒,在这种低级失误上浪费整整一天的时间,要多不值有多不值。谨记,谨记。
我们遵循MVC,首先我们创建模型,新建一个person类,存放XML文件中描述的person属性。再来一个解析XML文件的工具类XMLUtil,我们在里面实现文件的获取,代理方法的实现。
先来看这两个类的代码:
#import &Foundation/Foundation.h&
@interface person : NSObject
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
#import &Foundation/Foundation.h&
#import &person.h&
@interface XMLUtil : NSObject&NSXMLParserDelegate&
@property (nonatomic, strong) NSXMLParser *
@property (nonatomic, strong) person *
@property (nonatomic, strong) NSMutableArray *
@property (nonatomic, copy) NSString *currentE
#import &XMLUtil.h&
@implementation XMLUtil
- (instancetype)init{
self = [super init];
if (self) {
NSBundle *b = [NSBundle mainBundle];
NSString *path = [b pathForResource:@&test& ofType:@&.xml&];
NSData *data = [NSData dataWithContentsOfFile:path];
self.par = [[NSXMLParser alloc]initWithData:data];
self.par.delegate = self;
self.list = [NSMutableArray arrayWithCapacity:5];
return self;
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@&parserDidStartDocument...&);
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI
qualifiedName:(nullable NSString *)qName attributes:(NSDictionary&NSString *, NSString *& *)attributeDict{
self.currentElement = elementN
if ([self.currentElement isEqualToString:@&student&]){
self.person = [[person alloc]init];
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if ([self.currentElement isEqualToString:@&pid&]) {
[self.person setPid:string];
}else if ([self.currentElement isEqualToString:@&name&]){
[self.person setName:string];
}else if ([self.currentElement isEqualToString:@&sex&]){
[self.person setSex:string];
}else if ([self.currentElement isEqualToString:@&age&]){
[self.person setAge:string];
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI
qualifiedName:(nullable NSString *)qName{
if ([elementName isEqualToString:@&student&]) {
[self.list addObject:self.person];
self.currentElement = nil;
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@&parserDidEndDocument...&);
-(void)parse{
[self.par parse];
OK,总算是大功告成,如果对代理的使用比较熟悉的话,这部分内容其实还蛮简单的。如果被代码转来转去弄晕了的话可以在每个block的最后都加一个打印输出,做好标记,你就能弄懂程序的执行顺序了。
我们点击NSXMLParse,有了!
来看GDataXML,它是一种DOM方式的解析类库。DOM实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。
在使用之前呢,我们还是先从网上下载GDataXML包,里面两个文件GDataXMLNode.h和GDataXMLNode.m导入到项目中来,编译,发现报错了,这是因为GDataXML是依赖libmxl2的,我们要去项目的Target中做一些设置。
找到项目的Tarfet,进入Build Phases里面的Link Binary With Libraries,点击“加号”,搜索libxml,把出现的包添加进去,这里最新版的XCode7和iOS9中,是libxml.2.2.tbd。再来到Build Settings,我们可以搜索一下,找到Header Search Paths,添加路径“/usr/include/libxml2”。再找到Other Link Flags,添加“-libxml2“还有就是如果你下载的GDataXML是不支持ARC的,那么你就要像上面那样去添加“-fno-objc-arc”,这个视你下载的GDataXML包版本而定。
再次编译,就顺利通过了。
接下来看看我们怎么用这个东西。贴代码之前我真的想说一句,比起苹果原生的类库,这些开源的第三方类库真的在用起来的时候不知道有多舒服,懒人必备啊。在实际的开发中可以为我们节省很多的时间与精力,但是还是要搞懂人家原生的东西,这样才叫学会了么。
- (IBAction)GDataXML:(id)sender {
NSString *path = [[NSBundle mainBundle] pathForResource:@&test& ofType:@&xml&];
NSData *data = [[NSData alloc]initWithContentsOfFile:path];
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data error:nil];
GDataXMLElement *rootElement = [doc rootElement];
NSArray *students = [rootElement elementsForName:@&student&];
self.GDatatext = [[NSMutableString alloc]initWithString:@&&];
for (GDataXMLElement *student in students) {
GDataXMLElement *pidElement = [[student elementsForName:@&pid&] objectAtIndex:0];
NSString *pid = [pidElement stringValue];
GDataXMLElement *nameElement = [[student elementsForName:@&name&] objectAtIndex:0];
NSString *name = [nameElement stringValue];
GDataXMLElement *sexElement = [[student elementsForName:@&sex&] objectAtIndex:0];
NSString *sex = [sexElement stringValue];
GDataXMLElement *ageElement = [[student elementsForName:@&age&] objectAtIndex:0];
NSString *age = [ageElement stringValue];
NSString *t = [NSString stringWithFormat:@&学号:%@ 姓名:%@ 性别:%@ 年龄:%@\n&, pid, name, sex, age];
[self.GDatatext appendString:t];
self.textView.text = self.GDatatext;
就一段,是不是看起来非常的舒服呢!
跑一下,跟我们刚才使用的NSXMLParse是不是一样呢?
哈,搞定!
XML解析总结
上述两种解析用到的类库分别代表了两种典型的XML数据解析方式,SAX和DOM,各有优势,比如在应对比较大数据量的XML文件时,后者由于需要先读取整个文档,性能和速度上就必然不及前者了。
其实现在在实际应用中XML已经越来越少了,但是说起iOS中的网络编程,就免不了和XML格式的数据打交道。还有就是,我们在这里仅仅介绍了两种常用的XML解析方式,如同解析Json数据一样,解析XML文件也有很多种方法,除了上述两种,还有比如像TBXML, TouchXML, KissXML, TinyXML等等,具体的使用方法可以去Github上找,都有使用方法的说明的。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:249565次
积分:4340
积分:4340
排名:第6312名
原创:159篇
转载:106篇
译文:16篇
评论:45条
文章:13篇
阅读:34491
文章:42篇
阅读:26952
文章:12篇
阅读:9843
(6)(7)(13)(11)(16)(17)(17)(12)(15)(25)(38)(54)(21)(22)(8)异步加载的练习demo
主要涉及知识点:
1.解析json格式数据,主要包括图片,文本
2.使用AsynTask异步方式从网络下载图片
3.BaseAdapter的“优雅”使用
4.使用Lru缓存算法
异步加载的练习demo
主要涉及知识点:
1.解析json格式数据,主要包括图片,文本
2.使用AsynTask异步方式从网络下载图片
3.BaseAdapter的“优雅”使用
4.使用Lru缓存算法
5.改进加载:仅在listview滑动停止后才加载可见项,滑动中不加载
具体代码可以参看
涉及到的知识点如上,这里做一个小结,仅对一些代码片段分析
1、异步加载
主要有俩个原因
【1】单线程模型
【2】耗时操作阻塞UI线程(网络下载等 )
常用的俩种方式
【1】多线程/线程池
【2】AsynTask (其实它底层也是线程池 核心线程数5,最大线程数128)
2、JSON数组解析
采用的是某网站的提供的接口(/api/teacher?type=4&num=30)返回的json数据如下
这里我们在listview中仅需要name picSmall picBig三个内容即可,在解析之前我们需要javaBean来存储这三个数据,因而需要先定义一个javaBean,NewsBean.文件代码如下:
下面就开始解析json,并将解析的数据放到List&NewsBean&,代码片段在MainActivity.java中
整个逻辑在 代码注释中很清楚,通过URL下载数据位String,先获取最外一级jsonobj,然后获取内部jsonArray数组,在for循环中子JsonObj,通过getString获取每个子Jsonobj中的标签对应的内容。(结合前面的json图来看)最后统一放到newsList中,作为后面listview适配器apapter的数据源
这里还涉及到java IO流的操String jsonString = readStream(new URL(URL).openStream());,主要是吧new URL(URL).openStream()得到的字节流蹭蹭封装成buffer(核心依然是装饰者模式),然后拼接成String形式返回,代码片段在MainActivity.java中
3、AsynTask异步加载
先来看看AsyncTask的定义:
public abstract class AsyncTask&Params, Progress, Result& {
}三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。
在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。一个异步任务的执行一般包括以下几个步骤:【1】.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。(在UI线程中执行,不可混淆)
以下几个是AsynTask继承时可以重写的函数【2】.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
【3】.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
【4】.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
【5】.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
【1】.异步任务的实例必须在UI线程中创建。
【2】.execute(Params... params)方法必须在UI线程中调用。
【3】.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
【4】.不能在doInBackground(Params... params)中更改UI组件的信息。
【5】.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
在MainActivity.java中,通过该方式进行异步加载json数据
详细见代码注释,逻辑比较简单在主线程中通过execute启动AsynTask
4 BaseAdapter的“优雅”使用
主要包含以下几点
1、自定义Adpter继承BaseAdpter;
2、定义变量:List&NewsBean&;LayoutInflater;
3、重写构造函数NewsAdpter(Context context, List&NewsBean& data)。
4、文艺方式重写getView()方法。
5、自定义类ViewHolder,映射相关的view对象
(适配器是架起数据到界面显示的一座桥梁,普通listview的核心就是在适配器上下功夫)
在getView中通过ViewHolder保存数据,结合setTag来给viewholder打标签,来解决listview滑动图片加载错位的问题,代码片段在NewsAdapter.java中
然后调用AsynTask异步方式,开始加载图片,关于加载图片这里采用了LRU算法,下面会分析。
5、优化的listview图片加载
通常在listview网络加载图片时,我们通常会做这样的处理: 仅在listview滑动停止后加载图片或者文字,这样可以减少卡顿
实现逻辑:在listview的adapetr中实现OnScrollListener接口,需要重写俩个函数
public void onScrollStateChanged(AbsListView view, int scrollState) 滚动状态改变触发,在这里可以判断滚动状态从而确定是否需要加载
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
一直都会触发,可以记录此时滚动的在屏幕中起始位置,便于加载处理,代码片段在NewsAdapter.java中
6、 图片下载 核心代码 ImageLoader.java
有以下几个看点
6.1、Lru缓存
对于从网络上获取图片这种需求,我们都要使用Cache来将我们的图片缓存起来,尤其是对于ListVIew这种,不能每次我们滑动ListView就重新从网上下载图片,这样会很浪费资源而且浪费手机的流量。在Android中,已经为我们提供了一个用于缓存的类LruCache。我们可以使用这个类来实现我们对于图片资源的缓存。(LruCache是将图片缓存在内存中,而还有个第三方的类DiskLruCache来将图片缓存到手机的Disk上,而我们大型的app,一般都是将LruCache和DiskLruCache结合起来使用,形成一个memory hierarchy。)
【1】需要预设缓存占SD卡的大小 代码片段在ImageLoader.java中
【2】添加到缓存
(可以通过url和bitmap的键值对方式关联)
【3】从缓存获取图片
Lru本质就是LinkHashMap,所以具备put get操作,Lru这里就不扩展开了,代码片段如下
6.2、加载图片
使用了LoadImages(start,end)该函数主要用来加载当前显示listview从start到end的图片用来配合listview仅在活动停止后加载,假设此时滑动停止屏幕listview在12-20行之间则只加载该区间的图片文本
【1】将start,end作为for循环,由于在NewsAdapter.java中已经记录了所有的URLS,因而String url = NewsAdapter.URLS[i]
并且i在[start,end]之间,这样就将url和start,end对应起来
【2】这样同样使用AsynTask来加载图片,这里使用一个AsynTask集合来管理,当开始下载时加入集合,下载完成回调时在onPostExecute中将该AsynTask从中remove掉
转载:http://blog.csdn.net/xsf50717/article/details/
用云栖社区APP,舒服~
【云栖快讯】快速解决数据库难题,云数据库经典案例及最佳实践直播专场!阿里云数据库专家团队成员倾囊相授!赶紧报名。&&
为企业和开发者提供稳定、安全、智能的把网站域名或应用资源转换为计算机用于互连的数字 IP地址,从而将最终用户的访...
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017云栖大会·上海峰会火热报名中
Loading...

我要回帖

更多关于 第三方支付数据库设计 的文章

 

随机推荐