您的位置:首页 > 编程语言

《第一行代码》——(服务最佳实践)问题,解决,体会

2017-08-22 16:44 756 查看
问题:在《第一行代码》中的服务最佳实践,写好代码后,点击startDownload按钮后,发现直接弹出”下载失败“的通知,程序并没有下载。



解决:笔者通过对作者提供的URL访问时发现,该url时无效的,所以找一个有效的url使用即可。也可以用书上前面搭建的Apache服务器方法(这个方法必须是在模拟器的环境下,其下载于使用书中已经详细)。在Apache的子文件夹dtdocs里面放一个较大文件,这里笔者放了一个Git.exe文件,然后将URL修改为http://10.0.2.2/+文件名,我这里时http://10.0.2.2/Git.exe.



最后点击模拟器里面的[Start Download]按钮,可以看到文件下载时的进度条,最后发现文件下载成功。也可以在下载中进行暂停,取消的操作。



体会:首先这一次的代码实践设计的范围跨了几个章节的知识,尤其笔者还是刚刚接触安卓,所以头都大了,但同时也是学到挺多的。

首先代码主要有四部分,DownloadListener接口,它内部的抽象方法实现是在服务里(DownloadService)实例化的,接口的主要作用就是对UI进行更新,在这里注意的一点是,就是接口里更新下载进度条的通知方式,因为服务方法里startDownload中开始已经通过前端服务来初始化一个通知,这个通知会一直存在,所以接口更新下载进度条的方法里的通知是获取已经存在的通知实例。

DownloadTask里面是关于一个下载实现的具体细节,因为这些是属于耗时操作,所以需要在子线程里面进行,在这里面首先需要给下载文件的指定路径,接下来是对已存在文件的分析,用来支持定点续传,已经对已经下载好的文件返回成功的标识,避免再次下载覆盖原文件。在while循坏里进行不断从网上获取数据,然后不断写入。所以暂停,取消的细节实现方式,也是需要在while循坏里。doInBackground的返回结果会在onPostExecute里面通过接口接口更新。在这里要注意的一点就是try里面的返回数据时,还会先执行finally里面的代码。

DownloadService是最重要的部分,因为我们希望下载是在后台也能进行的,所以将子线程放入服务器是最好的处理方式。这里面除了之前提到的接口实例化之外,还新建了一个类,用户让活动与服务联系紧密,让活动更直接的去操纵服务里的方法,开始下载,暂时下载,取消下载。在取消下载里面还分了情况,因为有下载时的取消,和下载完成后的取消。前者直接通过downloadtask实例去调用删除方法。后者因为已经没有实例了所以需要指定文件进行删除

主活动里面的就时一般的处理,申请动态权限,对按钮进行监听执行相应操作。

改善:笔者觉得在调用服务中的删除方法时,将删除提示放入if条件句中更合适,否则文件不存在时,点击删除按钮也会出现删除提示。



最后:还是有一些问题,就是如果我在主活动里面的布局点击开始下载,下载完成后,模拟器上面会有个通知图标,但是如果在下载时拉下状态栏,下载完成后没有出现通知图标,但通知还在。


 
                                  



                             
     


这是模拟器的原因,还是代码的原因,没有进行真机测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐