EA&UML日拱一卒-微信小程序实战:位置闹铃 (11)-稍微聪明一点

问题的提出


小程序使用wx.playVoice播放音频时,需要从网上下载播放的对象文件,但是每次播放都要下载的话,就太傻了。好在小程序提供了保存文件的功能。


思路


准备一个url到缓存文件的映射,当小程序成功的下载播放铃声以后,自动保存下载的文件名。下次播放同一个文件时确认是否存在已经下载的文件,如果有则直接播放已经下载的文件。由于某些不知道的原因,我们假设已经下载的文件也可能播放失败,对策是重新下载该文件。


实现


下面的代码在app.js中,是这个处理的主线。


//播放铃声文件,优先使用缓存文件,根据需要下载。

 playRingtone: function(index) {

   var that = this

   var url = that.getRingtoneUrl(index)

   var savedFile = that.globalData.urlMap[url]

   if (savedFile != undefined){      

     //已经存在缓存文件,直接播放缓存文件

     that.addLog('播放缓存铃声')

     wx.playVoice({

       filePath: savedFile,

       fail:function(){

         //播放缓存文件失败,清除缓存文件信息

         that.globalData.urlMap[url] = undefined;

         wx.setStorageSync('urlMap', that.globalData.urlMap);

         //下载并播放缓存文件

         that.downloadAndPlayRingtone(url)

       },

     })

   }else{

     //没有缓存文件,下载并播放

     that.downloadAndPlayRingtone(url)

   }

 },


程序中用到了downloadAndPlayRingtone函数,其代码如下。


 //下载,保存,播放铃声文件。

 downloadAndPlayRingtone:function(url){

   var that = this

   that.downloadFile({

     url: url,

     success: function (savedFilePath) {

       //that.addLog('saveFileSuccess')

       //下载成功,播放文件

       that.addLog('播放下载铃声')

       wx.playVoice({

         filePath: savedFilePath,

       })

       //更新缓存文件信息。

       that.globalData.urlMap[url] = savedFilePath;

       wx.setStorageSync('urlMap', that.globalData.urlMap);

     }

   })

 },


下载铃声和播放铃声是应用领域的功能,为了促进代码重用,我们又抽出一个共同函数downloadFile。


提炼共通功能的关键并不在于它会被多少次使用,而在于它可以成为一个共通的功能。


//下载并保存文件

 downloadFile: function(parameter){

   var that = this

   wx.downloadFile({

     url: parameter.url,

     success: function (res) {

       //保存临时文件,以供将来使用

       wx.saveFile({

         tempFilePath: res.tempFilePath,

         success: function (save_res) {

           parameter.success(save_res.savedFilePath)

         }

       })

     },

   })  

 },


执行结果


可以看到,第一次是播放下载铃声,以后都是播放缓存铃声。log的出处可从代码中找到。



小程序代码


最新代码已经将代码上传到GitHub。


工程全体:

https://github.com/xueweiguo/alarmmap


app.js

https://raw.githubusercontent.com/xueweiguo/alarmmap/master/app.js


写在文章的最后


既然已经读到这里了,拜托大家再用一分钟时间,将文章转发到各位的朋友圈,微信群中。本公众号的成长需要您的支持!
以上就是今天的文章,欢迎点赞并推荐给您的朋友!

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】