android:
layout_width="fill_parent"
android:
layout_height="240dip"
android:
id="@+id/surfaceView"
/>
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
gravity="center"
>
android:
id="@+id/playTime"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="00:
00"
>
android:
id="@+id/progress_bar"
android:
layout_height="wrap_content"
android:
layout_width="200px"
android:
layout_toRightOf="@id/playTime"
style="?
android:
attr/progressBarStyleHorizontal"
/>
android:
id="@+id/totalTime"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_toRightOf="@id/progress_bar"
android:
text="00:
00"
>
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
gravity="center"
>
id="@+id/button_up"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_marginTop="5px"
style="?
android:
attr/buttonStyleSmall"
android:
src="@drawable/button_up"/>
id="@+id/button_play"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_toRightOf="@id/button_up"
android:
layout_marginTop="5px"
style="?
android:
attr/buttonStyleSmall"
android:
src="@drawable/button_pause"/>
id="@+id/button_next"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_toRightOf="@id/button_play"
android:
layout_marginTop="5px"
style="?
android:
attr/buttonStyleSmall"
android:
src="@drawable/button_next"/>
代码为:
1.3.3XML解析
Ø文件结构:
在本应用中从服务器端信息都是以XML形式获得,这里就在所难免的需要使用前面章节讲到的XML解析相关应用。
实体类
首先需要我们根据需求写出相应的实例类。
结合本例,需要解析的有两个实体。
1:
当用户发出请求需要获得内容列表时,解析视频信息需要的视频对象。
2:
当用户发出请求需要获得内容分类时,解析分类信息需要的分类对象。
com.sharpandroid_video.channel.entity
+Video.java
+Category.java
Handler类
使用SAX解析,在处理不同类型的XML时就需要不同的Handler类,这是SAX解析的特点。
com.sharpandroid_video.channel.entity.xml
+ChannelHandler.java
+VideoHandler.java
由于从服务器得到的XML的结构较为简单,在重写Handler时,没必要重写无关的事件,ChannelHandler.java代码如下:
packagecom.sharpandroid_video.channel.entity.xml;
importjava.util.ArrayList;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
importcom.sharpandroid_video.channel.entity.Category;
publicclassChannelHandlerextendsDefaultHandler{
privateStringcontent;
privateCategorycurrent=newCategory();
publicArrayListchannels=newArrayList();
@Override
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException{
Stringpart=newString(ch,start,length);
if(!
part.equals("\n"))
if(content!
=null)
content+=part;
else
content=part;
}
@Override
publicvoidendElement(Stringuri,StringlocalName,Stringname)
throwsSAXException{
if("categoryid".equalsIgnoreCase(localName)){
current.setCategoryid(content);
}elseif("regularIcon".equalsIgnoreCase(localName)){
current.setRegularIcon(content);
}elseif("AltIcon".equalsIgnoreCase(localName)){
current.setAltIcon(content);
}elseif("Thumbnail".equalsIgnoreCase(localName)){
……………….
channels.add(current);
current=newCategory();
}
content=null;
}
}
大家可以看到,本例里只是重写了characters(),endElement()两个事件,就完成了需求。
这是值得注意的,在开发过程中并不是所有的Handler事件都要重写的,结合你需要解析的XML特点,编写以最简洁的方式完成自己的应用,才是最佳方式。
VideoHandler.java的编写类似,故不再赘述。
方法实现:
com.sharpandroid_video.helper
+ParserXML.java
在实体类,Handler类编写完毕,就是整体的实现过程,下面给出获得“推荐内容”XML文件的过程。
其他方法类同。
publicstaticArrayList
try{
VideoHandlerhandler=newVideoHandler();
Stringhttp="http:
//192.168.1.188:
8080/SharpVideo/getSharpVideo.jsp";
InputStreaminput=newURL(http).openStream();
SAXParsersp=spf.newSAXParser();
XMLReaderreader=sp.getXMLReader();
reader.setContentHandler(handler);
InputSourceinputSource=newInputSource(input);
reader.parse(inputSource);
input.close();
returnhandler.videos;
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
1.3.4视频文件下载
Ø下载模块概述
为了实现视频的播放,需要将文件从网络下载到本地,将文件存储在手机的SD卡中,之后再随时读取SD卡中的文件,实现文件的播放。
在下载中为了提高运行的效率和用户的体验,我们依然采取多线程、断点的方式,在之前的网络一章中已经重点介绍了如何实现多线程、断点下载,下面我们就来进一步完善它。
说明:
由于此模块是在以前多线程、断点功能上完善,很多代码都是重复的,而且数量是很多的。
此节只介绍了关键代码,有些删减的代码需要回顾网络一篇多线程、断点下载。
望理解。
实现流程:
在BrowserActivity界面中弹出buildDialog对话框--下载DownLoaderActivity界面--点击【下载】Button--断点、多线程下载
--点击【暂停(删除)】Button--下载暂停(删除)
--点击【返回首页】Button--回到首页界面
--点击【已下载列表】Button--转到已经文件界面
实现思路:
1.在实现断点、多线程的基础上传入一个唯一标识位实现下载的暂停和删除。
2.将已经下载的文件存入到SD卡的同时,新建一个数据库表,存入下载文件的相关信息。
3.点击【已下载列表】按钮通过Intent跳转到已下载目录,并显示已下载文件信息。
4.点击已下载文件的任意信息,跳转到播放的界面,实现本地播放。
5.点击【返回首页】按钮通过Intent跳转到首页。
Ø下载模块的下载
文件的下载将采用多线程、断点的方式,相关知识已经在网络一篇有很详细的介绍,这里就不再过多赘余,下面是实现下载的时序图:
如有不清楚请回顾网络一章,现在要在此基础上实现下载的暂停和删除操作。
Ø下载模块的暂停
首先需要了解下载过程中线程的相互关系:
1.主进程(主线程)开启了一个download线程。
2.download线程又开启了三条用于真正下载的线程。
它们在工作的过程中是独立的,并发的执行流,当要暂停下载操作时,需要同时听停止三条真正下载的线程,在线程中已经为我们提供了类似的方法,但是这里我们使用标记位的方式来实现。
当点击下载的同时给其绑定一个Map值,其key为每一个下载资源的path,values为每一个下载传入一个Boolean的值,true或者false。
当我们点击【下载】时会同时也把这个标记值传过去,在实现下载的DownloadThread类中进行判断,如果传入是true则下载。
反之点击【暂停】时,传入是false则暂停。
注意:
在暂停时不要单一的去暂停当前下载的线程,因为操作系统是采用的是效率更高的抢占式多任务策略,如果你停了其中的一个,还有两个可以抢占cpu资源继续下载,所以我们根据它的唯一标记url来判断,则可以同时将其停止。
编写DownLoaderActivity.java代码:
(完整)
packagecom.sharpandroid_video.download.download.activity;
publicclassDownLoaderActivityextendsActivity{
privatestaticfinalStringTAG="DownLoaderActivity";
privateEditTextpathEditT