这次实现得是获取XX音乐热门榜单,使用的还是易源接口API,网址是https://www.showapi.com/,感兴趣的去看一看啦~

先给大家看一下我实现得效果吧@@

咳咳,是不是很好看@@,先整理一下思路吧。易源数据提供的API接口,直接访问就可以获取相关的数据了,然后将数据显示到自己的界面上,这样就大功告成了!!!好像不难对吧。

1、获取数据

这个是获取数据的url了,你可以放到浏览器里面去访问以下,其中showapi_appid是应用id,showapi_sign是密钥,这两个参数都要你去易源数据注册的,免费的。然后还有一个topid参数,这个参数易源数据也有介绍:

这么说可以获得11种榜单,哈哈哈美滋滋,为了方便呢,我先去浏览器里面试一下!!!我用topid=3去获取欧美的榜单:

返回的是一大串json数据,你可以把这些数据放到在线json解析的网页里面去,然后就可以一目了然了。

这!!!有100条数据,要是能控制获取多少条就好了,没办法!!他提供的API就是这样。一次100条歌曲信息。。。我只要前三条就行,刚好欧美榜的第一名、第二名和第三名,其他榜单的也是一样的。

这里简要谈一下android怎么通过网络获取信息,HttpGet发送GET请求,然后通过HttpResponse获取网络流,将返回的数据读到一个bufferReader里面。。是不是很复杂!!然后我就没用这个,有一个OkHttp框架,发送GET请求和POST请求都特别的方便。我贴一下官网的GET请求代码吧:

OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {Request request = new Request.Builder().url(url).build();Response response = client.newCall(request).execute();return response.body().string();
}

再贴一下我获取数据的代码吧:

private OkHttpClient client = new OkHttpClient();private String getTopSongByGet(int id) throws IOException {Request request = new Request.Builder().url("http://route.showapi.com/213-4?showapi_appid="+NetWorkUtils.APPID+"&showapi_sign="+NetWorkUtils.SECRET+"&topid="+id+"&").build();Response response = client.newCall(request).execute();return response.body().string();}

就几行代码就搞定,然后会返回一个字符串,想用的可以去百度学习一下。

言归正传!!我们现在可以获取到json数据,那么就通过JSONObject对象对json数据进行一个解析就好了,拿到歌曲信息的数组。代码如下:

                 JSONObject jsonObject = new JSONObject((String)msg.obj);JSONArray ja = jsonObject.getJSONObject("showapi_res_body").getJSONObject("pagebean").getJSONArray("songlist");final ArrayList<NetWorkMusic> list = new ArrayList<NetWorkMusic>();for(int i = 0; i < 3;i++){//先只获取前三显示到UI界面JSONObject jo = ja.getJSONObject(i);String singername = jo.getString("singername"); //显示歌曲,String songname = jo.getString("songname"); //显示歌名,String m4a = jo.getString("url"); //用来播放歌曲String albumpic_big = null;if(jo.isNull("albumpic_big")){albumpic_big = null;}else{albumpic_big = jo.getString("albumpic_big"); //用来设置背景和圆盘}String songid = jo.getString("songid"); //用来查找歌词NetWorkMusic netWorkMusic = new NetWorkMusic(songid,m4a,albumpic_big,songname,singername);list.add(netWorkMusic);}

我这里只取前三条数据,要那么多也没用,嘎嘎。。

2、界面布局

界面布局这个就是慢慢调啦,线性布局加上相对布局,如果数据太长显示不了就加一个ScrollView就行。主要的控件就是专辑图片,和前三名的歌名和演唱者,图片选的是第一名的专辑音乐图片,这里涉及到NetWorkMusic实体类,看不懂看我上一篇博客吧!!!

简要看一下我的布局吧,这个东西自己设计就好了:

3、显示数据

显示数据这个有点小技巧,因为我在布局里面有11个LinearLayout,所以很多个id(专辑图片id,三个textview,再乘以11,这样就有44个id了,一个个去findviewbyid吗??),我们可以打开gen文件夹下的R.java文件,这个文件里面有你的所有id,drawable,color,dimen等等这些数据的信息。

然后我就发现了一个规律,后一个在前一个的基础上+4,这么就可以用一个简单的循环就搞定了,哈哈哈,直接贴我的代码吧,还有三个textview的规律也是一样的,这样就差不多搞定了。

//根据R文件里面id的规律进行一个初始化for(int i = 0; i < 11; i ++){bgTop[i] = (ImageView) views.findViewById(R.id.bg_top1 + 4 * i);topTv1[i] = (TextView) views.findViewById(R.id.top1_tv1 + 4 * i);topTv2[i] = (TextView) views.findViewById(R.id.top1_tv2 + 4 * i);topTv3[i] = (TextView) views.findViewById(R.id.top1_tv3 + 4 * i);}

后面就是将数据添加到相应的控件上去,这个我就简要介绍一下:

首先发送网络请求的方法肯定要在子线程中执行,然后通过handler处理将数据更新到界面上去。差不多就是这样。然后有11种排行榜需要获取,循环发送11次吗?我一开始是这样干的!然后效果是只获取到一条的数据!!!子线程没有结束的时候再去获取下一个排行榜的数据,然后就冲突了!!不深究里面的原理了,我直接贴代码吧!!

public class OnlineMusicFragment extends Fragment {private ImageView[] bgTop = new ImageView[11];private TextView[] topTv1 = new TextView[11];private TextView[] topTv2 = new TextView[11];private TextView[] topTv3 = new TextView[11];private ImageView currentBgTop;private TextView currentTopTv1;private TextView currentTopTv2;private TextView currentTopTv3;private int currentId;private int index = 0; private int[] ids = {3,4,5,6,16,17,26,27,28,32,36};@Overridepublic View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {System.out.println("初始化网络音乐界面");View views = inflater.inflate(R.layout.tab02, container,false);initView(views);currentId = ids[index];currentBgTop = bgTop[index];currentTopTv1 = topTv1[index];currentTopTv2 = topTv2[index];currentTopTv3 = topTv3[index];getDataFromNetWork();return views;}private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:try {JSONObject jsonObject = new JSONObject((String)msg.obj);JSONArray ja = jsonObject.getJSONObject("showapi_res_body").getJSONObject("pagebean").getJSONArray("songlist");final ArrayList<NetWorkMusic> list = new ArrayList<NetWorkMusic>();for(int i = 0; i < 3;i++){//先只获取前三显示到UI界面JSONObject jo = ja.getJSONObject(i);String singername = jo.getString("singername"); //显示歌曲,String songname = jo.getString("songname"); //显示歌名,String m4a = jo.getString("url"); //用来播放歌曲String albumpic_big = null;if(jo.isNull("albumpic_big")){albumpic_big = null;}else{albumpic_big = jo.getString("albumpic_big"); //用来设置背景和圆盘}String songid = jo.getString("songid"); //用来查找歌词NetWorkMusic netWorkMusic = new NetWorkMusic(songid,m4a,albumpic_big,songname,singername);list.add(netWorkMusic);}//更新图片new Thread(){public void run() {try {if(list.get(0).getAlbumpic_big() != null){URL url = new URL(list.get(0).getAlbumpic_big());Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());currentBgTop.setImageBitmap(bitmap);}} catch (Exception e) {e.printStackTrace();} };}.start();currentTopTv1.setText("1 "+list.get(0).getSongname()+"---"+list.get(0).getSingername());currentTopTv2.setText("2 "+list.get(1).getSongname()+"---"+list.get(1).getSingername());currentTopTv3.setText("3 "+list.get(2).getSongname()+"---"+list.get(2).getSingername());//继续更新图片try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}index++;if(index < 11){currentId = ids[index];currentBgTop = bgTop[index];currentTopTv1 = topTv1[index];currentTopTv2 = topTv2[index];currentTopTv3 = topTv3[index];getDataFromNetWork();}} catch (JSONException e) {e.printStackTrace();}break;default:break;}};};private void getDataFromNetWork() {new Thread(){public void run() {try {System.out.println("当前ID:"+currentId);String result = getTopSongByGet(currentId);Message msg = new Message();msg.what = 1;msg.obj = result;handler.sendMessage(msg);} catch (IOException e) {e.printStackTrace();}};}.start();}private OkHttpClient client = new OkHttpClient();private String getTopSongByGet(int id) throws IOException {Request request = new Request.Builder().url("http://route.showapi.com/213-4?showapi_appid="+NetWorkUtils.APPID+"&showapi_sign="+NetWorkUtils.SECRET+"&topid="+id+"&").build();Response response = client.newCall(request).execute();return response.body().string();}private void initView(View views) {//根据R文件里面id的规律进行一个初始化for(int i = 0; i < 11; i ++){bgTop[i] = (ImageView) views.findViewById(R.id.bg_top1 + 4 * i);topTv1[i] = (TextView) views.findViewById(R.id.top1_tv1 + 4 * i);topTv2[i] = (TextView) views.findViewById(R.id.top1_tv2 + 4 * i);topTv3[i] = (TextView) views.findViewById(R.id.top1_tv3 + 4 * i);}}
}

应该不是很难,重点还是获取数据那一段,这些显示一下信息,老老实实敲代码就好了。。。项目源码暂时不会给大家。。

Android音乐播放器-热门榜单相关推荐

  1. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  2. android七大主流Android音乐播放器横向评测

    随着智能手机和3G网络的普及,移动互联网日益成为人们生活娱乐的重心之一.在音乐领域,竞争也十分激烈,在PC之后,几大提供音乐服务的厂商正在加紧占据手机客户端. 本期我们在Android平台挑选了七家国 ...

  3. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

    Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...

  4. android音乐播放器ppt,基于Android音乐播放器设计与开发.ppt

    基于Android音乐播放器设计与开发 毕业设计 基于Android的音乐播放器 设计与开发 设计概述 研究背景 研究意义 研究目标 系统演示 研究背景 随着Android智能手机的普及,用户越来越能 ...

  5. 基于android的音乐播放器毕业设计,基于android音乐播放器的毕业设计ppt

    <基于android音乐播放器的毕业设计ppt>由会员分享,可在线阅读,更多相关<基于android音乐播放器的毕业设计ppt(29页珍藏版)>请在人人文库网上搜索. 1.1. ...

  6. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

  7. 简单android音乐播放器课程设计,android音乐播放器课程设计报告.doc

    android音乐播放器课程设计报告 android音乐播放器课程设计报告 基于Android音乐播放器的设计与实现 滨江学院 <移动通信程序设计> 课程设计 题 目 院 系 专 业学生姓 ...

  8. android音乐播放器完整教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  9. 自编Win8风格Android音乐播放器应用源码(单机版)

    用闲暇的两天时间,研究编写了一个类Win8风格的android音乐播放器,实现了大部分基本功能.下面看具体描述: 基本实现功能: 注意事项:Android系统版本须在2.2以上,保证手机安装有SD卡( ...

最新文章

  1. JavaScript常用函数
  2. 网站jcms流程分析
  3. Java内存模型、volatile、原子性、可见性、有序性、happens-before原则
  4. Day18 (一)类的加载器
  5. Struts2 转换器
  6. python 科学计算设计_Python程序设计与科学计算
  7. 前期易语言编程作品收录|赤壁盗号|
  8. 使用命令行提取微软补丁文件
  9. 在FPGA上完美复刻Windows 95
  10. “一寺一墓”的典型格局
  11. 惠普电脑u盘重装系统步骤_惠普电脑如何重装系统?惠普电脑用U盘重装win10系统教程...
  12. 2021中国低/无代码平台投融资趋势报告: 融资规模近15亿,估值近70亿,马太效应将愈演愈烈...
  13. 如何关闭Internet Explorer 增强的安全配置
  14. python京东预约抢购_京东抢购脚本js教程
  15. 如何实现JAVA游戏存档_保存游戏数据 – Java
  16. 从 Git 提交中删除文件
  17. 计算机科学与应用专业介绍,专业介绍 | 计算机科学与技术
  18. c语言标准化考试系统课程设计,c语言标准化考试系统课程设计
  19. TensorFlow + GPU配置
  20. 【7000字】从 0-1 构建指标体系

热门文章

  1. 金蝶系统服务器上怎样备份文件,金蝶服务器数据库备份
  2. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果
  3. php输出甲子年,甲子年是哪一年?甲子年生人今年多大?
  4. 在有已认证的公众号情况下,复用资质快速注册小程序,免除再次认证费用
  5. 天津2019全国计算机二级,2019年上半年全国计算机等级考试报名啦
  6. 【无标题】C语言编写一个简单答题系统
  7. 【转】微信小程序日期时间选择器(年月日时分秒)
  8. bilibili 实时计算平台架构与实践
  9. python,使用微信远程控制电脑或使用微信定时发送消息关于QR.png报错的解决办法
  10. 【Gephi】初学者教程(一)「一步一步教你怎么画图」「值得放进收藏夹吃灰系列」