最近根据同学的建议,编写了一个网络音乐播放器的小项目。主要目的在练习网络相关的内容,其中根据百度音乐公开的API进行网络部分的编写。这就遇到了获取返回JSON数据的问题。很多人都知道,公开的API格式一般是这样的:</span>
http://tingapi.ting.baidu.com/v1/restserver/ting?format=json&calback=&from=webapp_music&method=baidu.ting.billboard.billList&type=1&size=10&offset=0
这其中?号之前的是域名,基于http协议,?号之后是参数及参数值,也就是在这个域名里根据各个参数的赋值,服务器将决定返回什么信息。
上面这个API是百度音乐的新歌榜的接口,返回的是JSON数据。因为是GET方法获取的,所以浏览器支持,把以上链接直接复制到浏览器中,就能得到返回的JSON数据。
刚看到这个JSON数据的时候是不是很头大。我刚看到也是醉的一塌糊涂,上千个字符的JSON,怎么写bean文件?没有bean文件怎么解析?赶紧请教大神同学,原来android studio中的Gsonformat插件可以直接根据浏览器中返回的JSON数据自动生成bean文件,简直太方便了(大神们贱笑了)。至于跟我一样也不知道这个插件的童鞋,可以试试,怎么装我就不说了,相信大家都会,不会的肯定也知道百度。
下面言归正传,接着说这个个get方法。最原始的肯定是用输入输出流来进行获得比如一下代码:
下载类 NUtils:
public class NUtils {
public interface Callback{
//是否取消下载
public boolean isCancelled(String url);
//下载完成之后,将数据回传
public void response(String url, byte[] bytes);
}
public static class AbsCallback implements Callback{
@Override
public boolean isCancelled(String url) {
// TODO Auto-generated method stub
return false;
}
@Override
public void response(String url, byte[] bytes) {
// TODO Auto-generated method stub
}
}
private static Handler mHandler =new Handler();
private static ExecutorService service= Executors.newFixedThreadPool(5);
public static void get(final String path, final Callback callback) throws UnsupportedEncodingException {
Log.e("Get",path);
service.execute(new Runnable() {
@Override
public void run() {
try{
HttpURLConnection conn=(HttpURLConnection) new URL(path).openConnection();
conn.setRequestProperty("Accept-Charset", "GBK");
conn.setRequestProperty("contentType", "GBK");
InputStream is=conn.getInputStream();
byte[] buffer=new byte[10*1024];
int len=-1;
ByteArrayOutputStream baos=new ByteArrayOutputStream();
if(conn.getResponseCode()==200){
while((len=is.read(buffer))!=-1){
baos.write(buffer, 0, len);
//判断是否取消
if(callback.isCancelled(path)){
return;
}
}
final byte[] bytes=baos.toByteArray();
mHandler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
callback.response(path, bytes);
}
});
}
}catch(Exception e){
e.printStackTrace();
}
}
});
}
}
调用类:
private void search(String searchstr) throws UnsupportedEncodingException {
Log.e("str",searchstr);
String path="http://tingapi.ting.baidu.com/v1/restserver/ting?format=json&calback=&from=webapp_music&method=baidu.ting.search.catalogSug&query="+searchstr;
// String path=new String(string.getBytes("UTF-8"),"iso-8859-1");
NUtils.get(path , new NUtils.AbsCallback() {
@Override
public void response(String url, byte[] bytes) {
super.response(url, bytes);
String json = new String(bytes);
// Log.e("json",json.toString());
String Json=json.trim();
SearchBean bean= fastJsonTools.createJsonBean(Json,SearchBean.class);
// Log.e("bean",bean.toString());
setSearchBean(bean);
}
});
}