为了提升手机端的响应速度,Foursquare采用了一种巧妙的措施,Foursquare在获取一个带图片的列表的时候,图片和文字区别对待。Foursquare先获取文字列表并显示出文字,而图片则是延迟加载。在加载图片的过程采用了缓存+多线程+线程池等技术优化读取速度。Foursquare读取图片的时候采用多线程技术,同时几个线程读取图片,并把读到的图片缓存起来,以便下次读取。读到图片以后通知界面更新。
图标读取优化是Foursquare中最为复杂的技术之一。在分析之前应该先掌握以下基础知识:
1.观察者模式。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。
详见http://baike.baidu.com/view/1854779.htm?fr=ala0_1
2.ExecutorService是java中用于管理一个线程池的类,使用实例参见
http://hi.baidu.com/coolinc/blog/item/0d5545d48c9183ce50da4bcf.html
3.Android notifyDataSetChanged() 方法:notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。
图片读取主要有四个类组成FetcherObserver 是RemoteResourceFetcher的Observer,等待RemoteResourceFetcher获取的数据后调用RemoteResourceManager中的notifyObservers()通知RemoteResourceManagerObserver更新界面。
RemoteResourceFetcher 通过网络以多线程的方式获取数据。获取图片代码:
ExecutorService mExecutor;
mExecutor = Executors.newCachedThreadPool(); //创建线程池
public Future<Request> fetch(Uri uri, String hash) {
Request request = new Request(uri, hash);
synchronized (mActiveRequestsMap) {
Callable<Request> fetcher = newRequestCall(request); //构造http请求
if (mActiveRequestsMap.putIfAbsent(request, fetcher) == null) {
if (DEBUG) Log.d(TAG, "issuing new request for: " + uri);
return mExecutor.submit(fetcher); //执行线程
} else {
if (DEBUG) Log.d(TAG, "Already have a pending request for: " + uri);
}
}
return null;
}
//构造的读取请求
private Callable<Request> newRequestCall(final Request request) {
return new Callable<Request>() {
public Request call() {
try {
if (DEBUG) Log.d(TAG, "Requesting: " + request.uri);
HttpGet httpGet = new HttpGet(request.uri.toString());
httpGet.addHeader("Accept-Encoding", "gzip");
HttpResponse response = mHttpClient.execute(httpGet); //执行http请求
HttpEntity entity = response.getEntity();
InputStream is = getUngzippedContent(entity);
mResourceCache.store(request.hash, is); //获取的数据存入到缓存中
if (DEBUG) Log.d(TAG, "Request successful: " + request.uri);
} catch (IOException e) {
if (DEBUG) Log.d(TAG, "IOException", e);
} finally {
if (DEBUG) Log.d(TAG, "Request finished: " + request.uri);
mActiveRequestsMap.remove(request);
notifyObservers(request.uri); //通知所有Observer 这里通知的是 FetcherObserver对象
}
return request;
}
};
}
FetcherObserver 监视RemoteResourceFetcher 并调用RemoteResourceManager
中的notifyObservers() 通知 RemoteResourceManager 中注册的Observer对象
public void update(Observable observable, Object data) {
setChanged();
notifyObservers(data); // 调用RemoteResourceManager中的notifyObservers通知RemoteResourceManagerObserver更新数据
}
RemoteResourceManager 管理缓存,并通知RemoteResourceManagerObserver
RemoteResourceManagerObserver调用更新方法更新界面
private class RemoteResourceManagerObserver implements Observer {
@Override
public void update(Observable observable, Object data) {
if (DEBUG) Log.d(TAG, "Fetcher got: " + data);
mHandler.post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged(); // 通知android界面更新
}
});
}
}
分享到:
相关推荐
2. 推荐系统:根据用户的签到历史和偏好,Foursquare提供个性化的地点推荐,帮助用户发现新的兴趣点。 3. 优惠券与奖励:商家可以通过Foursquare发布优惠券,吸引用户光顾,同时用户通过频繁签到可以获得“勋章”等...
从这个文件名我们可以推测,当时Foursquare可能正处于快速发展的阶段,不断优化用户体验,增加新功能,如更准确的定位服务、更丰富的商家信息以及更完善的社交元素。 随着移动互联网的普及,Foursquare逐渐演变成一...
foursquare-ios-api, 用于iOS的Foursquare API v2 用于iOS的 Foursquarefoursquare API的简单 ... 它允许你将foursquare集成到你的iOS应用程序中。特性简单,小巧,易于使用使用Safari进行身份验证( 请参见下面的
Foursquare数据集 Abstract: Foursquare is a location-based social networking website, software for mobile devices. This service is available to users with GPS enabled mobile devices, such as iPhones ...
【Foursquare源码分析】 Foursquare是一款流行的社交网络应用,主要功能是让用户发现周围的地点、分享自己的位置以及提供个性化的本地推荐。其源码分析可以帮助我们深入了解移动应用开发,特别是与地理位置服务相关...
foursquare, 用于 python的Foursquare API客户端 foursquare用于 foursquare API的python 包装器。哲学:映射 foursquare one-to-one的端点简洁,简单,Pythonic 调用只处理原始数据,定义你自己的模型功能:pyth
【foursquare android客户端源代码】是一份专为Android平台设计的开源项目,它揭示了foursquare这一著名社交网络应用在移动设备上的实现细节。这份源代码为开发者提供了深入理解移动应用开发,特别是Android平台上...
### FourSquare NYC 数据集知识点解析 #### 一、数据集概览 **标题与描述**:“FourSquare NYC 数据集”这一标题与描述简洁地指出了数据集的核心内容——由FourSquare公司提供的纽约市(NYC)的位置签到数据。此类...
《基于地理位置的社交网络研究:以foursquare数据集2011-2013_美国各城市为例》 foursquare数据集是研究基于地理位置的社交网络(LBSN,Location-Based Social Networks)的重要资源,它包含了2011年至2013年间美国...
《foursquare数据集1-4:社会网络大数据的洞察与分析》 foursquare数据集1-4是研究社会网络、大数据分析以及地理定位服务的重要资源,它为我们揭示了用户在现实世界中的行为模式、社交关系以及城市空间的使用方式。...
用于做位置预测和位置推荐的数据...Foursquare的用户较少,本文选取家在纽约的用户进行签到行为研巧。Foursquare签到 数据集用户个人信息中具有homecity属性.表征用户的家所在位置。
Unofficial Foursquare® Client for Android Wear. Download: (join the beta) Features: Lightning fast check-in from your watch: Quickly explore your neighbourhood: Future plans report ...
国外LBS--Foursquare案例研究报告 PDF
本资源包含了RankGeoFM方法实验中所用到的两个重要数据集:FourSquare和Gowalla。 FourSquare数据集是基于地理位置服务的社交网络平台Foursquare上的用户签到数据。这个数据集记录了用户在不同时间、地点的签到信息...
2. **地图集成**:Foursquare大量使用了Google Maps Android API,展示了如何在应用中集成地图,显示用户的当前位置,以及如何添加自定义标记和覆盖层。这涉及到地理坐标处理、地图交互事件监听等技术。 3. **GPS和...
《Foursquare与兴趣点推荐:深度解析CA Dataset》 Foursquare,作为一个全球知名的社交网络和本地发现平台,提供了大量的用户签到数据,这些数据对于研究兴趣点推荐算法具有极高的价值。"Foursquare-JiHui-Content-...
Collection Picker is an Android View library which looks like Foursquare Tastes picker. For more information see the website. Usage Gradle compile 'com.anton46:collection-picker:1.0.2' Maven ...
**前端开源库-node-foursquare** 是一个专为前端开发者设计的开源库,它主要针对的是Foursquare的API,特别是其Swarm API的V2版本。这个库是用JavaScript编写的,旨在为Node.js环境提供一个易于使用且具有容错功能的...