Android Jamendo源码分析之 网络连接模块
2012-08-20 15:24
411 查看
程序中实现网络连接和获取网络数据是通过JamendoGet2Api这个接口中的方法实现的,他的实现类是JamendoGet2ApiImpl.这里就以getPopularAlbumsWeek()这个函数为例分析.
class JamendoGet2ApiImpl中
getPopularAlbumsWeek函数源码:
@Override
public Album[] getPopularAlbumsWeek() throws JSONException, WSError {
String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?n=20&order=ratingweek_desc");
if(jsonString == null)
return null;
JSONArray jsonArrayAlbums = new JSONArray(jsonString);
return AlbumFunctions.getAlbums(jsonArrayAlbums);
}
首先通过doGet方法根据指定的url通过HTTP协议获取网络数据。
里面的 doGet函数 调用 Caller.doGet
函数返回网络数据。
Caller.get 函数源码:
public static String doGet(String url) throws WSError{
String data = null;
if(requestCache != null){
data = requestCache.get(url);
if(data != null){
Log.d(JamendoApplication.TAG, "Caller.doGet [cached] "+url);
return data;
}
}
// initialize HTTP GET request objects
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse;
try {
// execute request
try {
httpResponse = httpClient.execute(httpGet);
} catch (UnknownHostException e) {
WSError wsError = new WSError();
wsError.setMessage(e.getLocalizedMessage());
throw wsError;
} catch (SocketException e){
WSError wsError = new WSError();
wsError.setMessage(e.getLocalizedMessage());
throw wsError;
}
// request data
HttpEntity httpEntity = httpResponse.getEntity();
if(httpEntity != null){
InputStream inputStream = httpEntity.getContent();
data = convertStreamToString(inputStream);
// cache the result
if(requestCache != null){
requestCache.put(url, data);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.d(JamendoApplication.TAG, "Caller.doGet "+url);
return data;
}
根据返回的字符串数据创建JSONArray对象:
JSONArray jsonArrayAlbums = new JSONArray(jsonString);
然后根据AlbumFunctions的静态函数getAlbums将封装在JSONArray中字符串数据转换为Album对象,然后放在数组中返回:
return AlbumFunctions.getAlbums(jsonArrayAlbums);
====================================================================================================
其中的 RequestCache类,类似一缓冲区
将访问数据,暂存于HashTable中,到需要访问一个url获取网络数据是,先到缓冲区中去查找,若查找到则直接返回,否则联网获取。
class JamendoGet2ApiImpl中
getPopularAlbumsWeek函数源码:
@Override
public Album[] getPopularAlbumsWeek() throws JSONException, WSError {
String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?n=20&order=ratingweek_desc");
if(jsonString == null)
return null;
JSONArray jsonArrayAlbums = new JSONArray(jsonString);
return AlbumFunctions.getAlbums(jsonArrayAlbums);
}
首先通过doGet方法根据指定的url通过HTTP协议获取网络数据。
里面的 doGet函数 调用 Caller.doGet
函数返回网络数据。
Caller.get 函数源码:
public static String doGet(String url) throws WSError{
String data = null;
if(requestCache != null){
data = requestCache.get(url);
if(data != null){
Log.d(JamendoApplication.TAG, "Caller.doGet [cached] "+url);
return data;
}
}
// initialize HTTP GET request objects
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse;
try {
// execute request
try {
httpResponse = httpClient.execute(httpGet);
} catch (UnknownHostException e) {
WSError wsError = new WSError();
wsError.setMessage(e.getLocalizedMessage());
throw wsError;
} catch (SocketException e){
WSError wsError = new WSError();
wsError.setMessage(e.getLocalizedMessage());
throw wsError;
}
// request data
HttpEntity httpEntity = httpResponse.getEntity();
if(httpEntity != null){
InputStream inputStream = httpEntity.getContent();
data = convertStreamToString(inputStream);
// cache the result
if(requestCache != null){
requestCache.put(url, data);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.d(JamendoApplication.TAG, "Caller.doGet "+url);
return data;
}
根据返回的字符串数据创建JSONArray对象:
JSONArray jsonArrayAlbums = new JSONArray(jsonString);
然后根据AlbumFunctions的静态函数getAlbums将封装在JSONArray中字符串数据转换为Album对象,然后放在数组中返回:
return AlbumFunctions.getAlbums(jsonArrayAlbums);
====================================================================================================
其中的 RequestCache类,类似一缓冲区
将访问数据,暂存于HashTable中,到需要访问一个url获取网络数据是,先到缓冲区中去查找,若查找到则直接返回,否则联网获取。
相关文章推荐
- Android Jamendo开源在线音乐播放器源码分析五 网络连接模块的分析
- Nginx源码分析 - HTTP模块篇 - ngx_http_optimize_servers函数和TCP连接建立过程
- Android网络框架源码分析一----Volley
- Android 获取当前系统的语言环境及网络连接类型(有源码)
- 虚拟机下下载android源码遇到网络连接错误
- Android-vold源码分析之连接电脑OTG(11)
- smack 源码分析- PacketReader (android上实现长连接)【3】
- Android网络框架-Volley(二) RequestQueue源码分析以及建立一个RequestQueue
- Android网络框架源码分析一---Volley
- Android-vold源码分析之连接电脑OTG
- Android FM模块学习之四源码分析(八)
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- Android中的网络管理源码分析--netd
- smack 源码分析一(android上实现长连接)
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- muduo源码分析之实现TCP网络库(连接的接收和关闭)
- 【开源中国Android客户端】源码分析 网络数据传输接口
- smack 源码分析- PacketWriter (android上实现长连接)
- Android网络框架-Volley(三) CacheDispatcher和NetworkDispatcher源码分析