打开Jammendo进入到首页之后,会看到这样一个界面。可以看到下左效果,我们可以看到,他是上部分的ViewFlipper模块和下半部分的listview模块构成的,今天就简单的说一下JammendoViewFlipper是如何加载实际的图片的

我们可以看到上面的ViewFlipper模块中有很多图片,这个模块第一次初始化的时候,实际作用可以理解为是——获取这个星期内最流行的专辑,并在ViewFlipper模块中展示

主界面功能在Jammendo中是在HomeActivity中实现的,可以看下他的布局文件

main.xml文件

<com.teleca.jamendo.util.FixedViewFlipperandroid:orientation="vertical" android:id="@+id/ViewFlipper"android:layout_width="fill_parent" android:layout_height="75dip"android:background="@drawable/gradient_dark_purple"><!-- (0) Loading --><LinearLayout android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_marginLeft="15dip" android:gravity="left|center_vertical"><com.teleca.jamendo.widget.ProgressBarandroid:id="@+id/ProgressBar" android:layout_width="wrap_content"android:layout_height="wrap_content"></com.teleca.jamendo.widget.ProgressBar></LinearLayout><!-- (1) Gallery --><LinearLayout android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"android:gravity="center"><Gallery android:id="@+id/Gallery" android:layout_width="fill_parent"android:layout_height="wrap_content" android:spacing="0px" /></LinearLayout><!-- (2) Failure --><LinearLayout android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_marginLeft="15dip" android:gravity="left|center_vertical"><com.teleca.jamendo.widget.FailureBarandroid:id="@+id/FailureBar" android:layout_width="wrap_content"android:layout_height="wrap_content"></com.teleca.jamendo.widget.FailureBar></LinearLayout></com.teleca.jamendo.util.FixedViewFlipper>

  在Jammendo中,他自定义了一个继承于ViewFlipper的FixedViewFlipper控件,并且在代码中重写了onDetachedFromWindow方法。在此,他重写这个方法的目的是为了防止一个bug的出现,可以参考下面这篇文章                               http://blog.sina.com.cn/s/blog_74c22b2101012urv.html

  我们可以看到在FixedViewFlipper控件中又包含了三个LinerLayerout布局,它们的作用分别如下:  

  (1)Loading:当图片加载比较慢的时候,会在ViewFlipper显示Loading字样

  (2)Gallery:Gallery是一个滑动图片展示控件,如何客户端可以成功从服务器获取数据,会将在这个控件中展示获取专辑内容

  (3)Fialure:客户端信息获取失败时,会提示加载失败

  让我们会到HomeActivity文件,在HomeActivity的OnCreate()方法中存在我们可以看到这样一段代码

  new NewsTask().execute((Void)null);

  这里的NewsTask是继承于AsyncTask的一个类,执行异步操作。异步操作的意义在于我们可以将一些比较费时的操作放在这里执行,提高整体工作效率。在这里,我们将客户端请求服务器端数据,并将数据显示到FixedViewFlipper这样一个过程放在这里执行。

  首先简单分析一下AsyncTask中一些基本方法的意义:

  (1)onPreExecute():在执行doingBackground方法前会执行这个方法,可以显示一些进度条之类的

  (2)doinBackground():耗费时间的动作主要在这个方法中执行

  (3)publicProgress():用来更新任务进度

  (4)onProgressUpdate():当publicProgress方法被调用时,UI线程将调用这个方法在界面上展示任务的进展情况

  (5)onPostExecute():任务执行完成,返回结果

private class NewsTask extends AsyncTask<Void, WSError, Album[]> {@Overridepublic void onPreExecute() {mViewFlipper.setDisplayedChild(0);        // 默认显示ViewFlipper中第一个界面mProgressBar.setText(R.string.loading_news);   //进度条文字super.onPreExecute();}@Override/** 获取专辑数据* */public Album[] doInBackground(Void... params) {JamendoGet2Api server = new JamendoGet2ApiImpl();Album[] albums = null;try {albums = server.getPopularAlbumsWeek();} catch (JSONException e) {e.printStackTrace();} catch (WSError e){publishProgress(e);}return albums;}@Overridepublic void onPostExecute(Album[] albums) {if(albums != null && albums.length > 0){mViewFlipper.setDisplayedChild(1); //  显示ViewFlipper中第二个界面ImageAdapter albumsAdapter = new ImageAdapter(HomeActivity.this);albumsAdapter.setList(albums);mGallery.setAdapter(albumsAdapter);mGallery.setOnItemClickListener(mGalleryListener);mGallery.setSelection(albums.length/2, true); // animate to center} else {mViewFlipper.setDisplayedChild(2);mFailureBar.setOnRetryListener(new OnClickListener(){@Overridepublic void onClick(View v) {new NewsTask().execute((Void)null);}});mFailureBar.setText(R.string.connection_fail);}super.onPostExecute(albums);}@Overrideprotected void onProgressUpdate(WSError... values) {Toast.makeText(HomeActivity.this, values[0].getMessage(), Toast.LENGTH_LONG).show();super.onProgressUpdate(values);}}

  在onPreExecute()方法中,我们可以看到,他这里执行了一个让FixedViewFlipper显示loading界面的功能

  doinBackground()方法主要完成了从服务器获取专辑信息的动作

  onPostExecute(),将当前获取数据绑定到Gallery控件之上,完成专辑信息的显示

  onProgressUpdate()如果发生异常,会弹出一个对话框提示

  下面我们主要分析一下doinBackground()函数到底干了些什么?

  public Album[] doInBackground(Void... params) {JamendoGet2Api server = new JamendoGet2ApiImpl();Album[] albums = null;try {albums = server.getPopularAlbumsWeek();} catch (JSONException e) {e.printStackTrace();} catch (WSError e){publishProgress(e);}return albums;}

  首先创建了一个JamendoGet2Api对象,然后定义了一个Album[]数组,在这里的Album[]其实存放的就是我们将要从服务器上获取的专辑信息

  下面调用server中的getPopularAlbumsWeek()获取专辑信息

  跳转到getPopularAlbumsWeek()方法

   private String doGet(String query) throws WSError{return Caller.doGet(GET_API + query);}@Overridepublic 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;try {JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums);} catch (NullPointerException e) {e.printStackTrace();throw new JSONException(e.getLocalizedMessage());}}

  getPopularAlbumsWeek中定义了一个jsonString来保存从从服务器上获取的数据,调用的doGet方法是在Caller类中定义,在这里只是传递了后面一些的参数信息

  跳转到Caller类中的doGet()方法中我们可以发现,他就是通常的json从服务器端获取数据的一个封装,值得我们注意的是他这里的Cache机制,当他收到当前url信息时,会先遍历本地的cache数据,如果本地存在,则不再去访问服务器获取数据。如果不存在于本地,则从服务端获取数据,并数据转换为String类型。

         String data = null;if(requestCache != null){data = requestCache.get(url);if(data != null){Log.d(JamendoApplication.TAG, "Caller.doGet [cached] "+url);return data;}}

  之后我们只需要一步步返回,便完成了从服务器端获取最近一个火爆专辑信息的获取。

  

转载于:https://www.cnblogs.com/cfyrwang/p/4432253.html

学习Jammendo代码的心路历程(二)ViewFlipper数据的填充相关推荐

  1. android checkbox监听另一个checkbox选中和不选中_一个真正0基础小白学习前端开发的心路历程...

    摘要:真正的0基础小白学习前端开发的心路历程. 距离第一阶段的结束敲响了末尾的声音,抱着初心从开始8号的学习到第一阶段的结束这期间要应付期末考试应付自己的各种事情学习时间总是挤出来的这次学习让我受益匪 ...

  2. 一个真正0基础小白学习前端开发的心路历程

    摘要:真正的0基础小白学习前端开发的心路历程. 距离第一阶段的结束敲响了末尾的声音,抱着初心从开始8号的学习到第一阶段的结束这期间要应付期末考试应付自己的各种事情学习时间总是挤出来的这次学习让我受益匪 ...

  3. html5制作心路历程,一个真正0基础小白学习前端开发的心路历程

    距离第一阶段的结束敲响了末尾的声音,抱着初心从开始8号的学习到第一阶段的结束这期间要应付期末考试应付自己的各种事情学习时间总是挤出来的这次学习让我受益匪浅呢?废话不多说上干货. 一.第一阶段html知 ...

  4. 接口测试 - 从0不到1的心路历程 (二)

    前段时间我发布了一篇有关自己做接口测试的实践经验,发出后受到了很多小伙伴的关注,也收到了很多佬儿哥的指点,很是开心,TesterHome真是一个温暖的地方.在众多建议中,频率最高的就是"py ...

  5. 【春招实习秋招】前端学习の优质资料整理心路历程(已上岸)

    引言 写这篇博客原因 我就简单谈谈我为什么要整理这份学习资料吧,首先,春招遗憾没有上岸,可以说没抓住机遇,准备也不够好,但我努力的轨迹还在,运气或许没到,但我坚持下来的勇气一直都在!每一份坚持都是成功 ...

  6. 等距离分箱matlab代码,数据挖掘实验(二)数据预处理【等深分箱与等宽分箱】...

    本文代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正. 一.分箱平滑的原理 (1)分箱方法 在分箱前,一定要先排序数据,再将它们分到等深(等宽)的箱中. 常见的有两种分箱方法:等深 ...

  7. 人工智能AI工程师学习路线心路历程和总结分享

    背景: 刚开始接触人工智能AI的时候,感觉很新鲜.很新颖,是一个未来的方向.充满了无限的憧憬,给自己定了一个目标:学习人工智能.接下来的问题:怎么学习?开始想过报名培训班,经过咨询之后,费用是一大笔开 ...

  8. 带倒计时RecyclerView的设计心路历程

    /   今日科技快讯   / 伴随着联想集团终止科创板IPO,在高负债率下已退休的柳传志约1亿元的高薪酬也被外界所质疑.此前有消息称,柳传志在香港上市公司联想集团拿317万美元的年薪,其在2020年的 ...

  9. 如何高效的学习TensorFlow代码?

    如何高效的学习TensorFlow代码? 如题,或者如何掌握TensorFlow,应用到任何领域? 添加评论分享 10 个回答 爱琳李,老李,明天就辍学了 8 人赞同 本来都忘了这个问题了,不过看到很 ...

  10. Android-嵌入式蓝牙 多年蓝牙产品开发学习心路历程分享-A2DP音频流的建立、A2DP播放暂停音乐命令交互、HFP、AVRCP、RFCOMM、OPP、AVDTP

    序言 当你点进来看到这段话的时候,证明你真心想学好蓝牙,哈哈哈,本来想搜索蓝牙某个协议,却成了一大段废话文,但此时,别退出去,如果你是一个牛逼的蓝牙开发者,只是想了解蓝牙某个协议或者知识点,那么直接点 ...

最新文章

  1. IF10+的数据库文章!这里有5个案例,一起发起来?
  2. 很久没有更新blog了,对不起每一位朋友。
  3. 句法分析(syntactic parsing)在NLP领域的应用是怎样的
  4. No virtual method diskCacheStrategy
  5. 字节跳动的敌人只有时间
  6. MongoDB模糊查询-查询某月的数据
  7. 虚拟机系统iso镜像下载_如何下载正版系统镜像
  8. mescroll.js -- 精致的下拉刷新和上拉加载js框架
  9. idea中MySQL数据库分页
  10. 学计算机高考英语听力考试时间,北京:2020年高考英语听力机考问答
  11. 【动手学深度学习】(task123)注意力机制剖析
  12. 音视频通话:​Linphone基于SIP协议的语音视频电话软件
  13. Android 高级面试题及答案
  14. 平面漩涡Shader
  15. TM1638的一些使用以及点亮数码管程序
  16. 海神祭司被机器人拉出来_美深海机器人意外殉职 水下10公里被挤碎(图)
  17. 2020连信活号技术_连信如何能注册出活号,连信怎么判断活号
  18. 控制系统分析2(线性系统稳定性、和可控性)
  19. java抓取七麦app排行榜单数据 导出excel-20211201
  20. 各种json工具包的比较:

热门文章

  1. Java 多线程执行
  2. Spring Boot 集成 Spring Security 实现权限认证模块
  3. mysql 无法退出sql命令行编辑
  4. Qt Pro语法总结
  5. Hadoop源码分析28 JobTracker 处理JobClient请求
  6. C# 从文本列中检索数据
  7. so easy 的弹出层——使用jquery
  8. Java或Web中解决所有路径问题
  9. 各种翻页的效果! FILTER: revealTrans使用说明
  10. 经典推荐:08年草根站长现状360度总结分析