首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Jamendo开源在线音乐播放器源码分析(3)

2012-09-12 
Jamendo开源在线音乐播放器源码分析(三)3、AsyncTasknew NewsTask().execute((Void)null)执行一个异步任务

Jamendo开源在线音乐播放器源码分析(三)

3、AsyncTask

new NewsTask().execute((Void)null);执行一个异步任务,也可以什么参数也不传。异步加载唱片的信息,调用相应的API,后面详说API,加载成功则显示唱片集的gallery,gallery中每一个item是一个自定义的ImageView,这个ImageView可以根据url异步加载唱片图片并缓存,即com.teleca.jamendo.widget.RemoteImageView,后面详说其实现。加载失败则显示retry,并弹出toast提示。

4、适配器adapter
在onResume()方法里的fillHomeListView();这个就是用来填充listview的方法,我们可以看到这个listview中有两种不同的布局,一种是类似分隔符的布局,一种就是可点击的菜单项。先分析下可点击的菜单项的adapter。

com.teleca.jamendo.adapter 包是适配器相关的类。
我们先看下ArrayListAdapter.java,它继承自BaseAdapter,这个adapter中的数据集都是放在ArrayList<T> mList中的,子类继承它覆写自己的getView()方法,程序中可以通过adapter.setList(ArrayList<T> list)或者adapter.setList(T[] list)将特定类型的值填充进去。
可点击的菜单项都是 ArrayListAdapter的一个子类:PurpleAdapter ,填充的类型则是<PurpleEntry>,PurpleEntry中有每一行的drawable和text以及点击后触发的操作。

下面就是整个list包括分隔符的总的adapter:SeparatedListAdapter。

public int getViewTypeCount()public int getItemViewType(int position)public boolean isEnabled(int position)
这三个方法呢 ,你注释掉也是没有关系的,程序也照样能跑,前两个方法主要是缓存listview中item需要用到的,分析源码,在listview的setAdapter()方法中,有个mRecycler这个变量,看它的注释可以知道,这个是用来缓存视图避免下次layout时重新create。mRecycler是ListView的父类AbsListView的一个内部类。往下看,mRecycler.setViewTypeCount( mAdapter.getViewTypeCount( ) );这儿调用了getViewTypeCount()方法,为了初始化这个用于缓存视图的ArrayList,当listview的在填充item时,会调用mRecycler.getScrapView(position),这个方法里会调用getItemViewType(int position)方法,根据返回的类型得到相应的缓存的视图,传递给adapter的getView()方法中的convertView,这样就可以复用了。

回到程序里,这个adapter中的getView()中并没有使用缓存视图即判断convertView是否为空,而是直接生成每一个view,所以这里覆写这两个方法主要是为了服务isEnabled(int position),这个方法是判断这一行能否点击的,用于分隔的headers是不能点击的。当然如果你把这3个方法注释掉了,headers就能点击了,也不会出错,回到HomeActivity的fillHomeListView()中,最后mHomeListView.setOnItemClickListener(mHomeItemClickListener);设置listview的点击事件,如果你点击分隔符headers,程序中会try住这个异常,所以也没事。正常点击的话会调用事先已经设置好的listener中的方法。

下篇分析music API。


热点排行