2021SC@SDUSC

public class CabinetService extends Service {}

创建一个CabinetService类,继承自Service类
类中的具体内容分析如下:

private String TAG = CabinetService.class.getSimpleName();public class LocalBinder extends Binder {public CabinetService getService() {return CabinetService.this;}}

首先创建Binder对象,返回给客户端即Activity使用,提供数据交换的接口,声明一个方法,getService此方法为提供给客户端调用。在方法中,返回当前对象LocalService,这样我们就可在客户端端调用Service的公共方法了。

    int mStartMode;IBinder mBinder;boolean mAllowRebind;

定义的三个变量依次代表:标识服务如果被杀死之后的行为;绑定的客户端接口;标识是否可以使用onRebind。便于后面精简代码。

public void onCreate() {EventBus.getDefault().register(this);MqttUtils.addMqttObserver(new CabinetObserver(this));Log.e(TAG, "service is created");MqttSchedule schedule = new MqttSchedule();schedule.rollMethod();}

重新定义了onCreate()方法,其中使用了mqtt 定时检测任务

@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e(TAG, "service is Start");return mStartMode;}

调用startService()启动服务时回调

@Overridepublic IBinder onBind(Intent intent) {Log.e(TAG, "service is onBind");return mBinder;}

通过bindService()绑定到服务的客户端

@Overridepublic boolean onUnbind(Intent intent) {Log.e(TAG, "service is onUnbind");return mAllowRebind;}

通过unbindService()解除所有客户端绑定时调用

@Overridepublic void onRebind(Intent intent) {Log.e(TAG, "service is onRebind");}

通过bindService()将客户端绑定到服务时调用

@Overridepublic void onDestroy() {Log.e(TAG, "service is onDestroy");EventBus.getDefault().unregister(this);}

服务不再有用且将要被销毁时调用

@Subscribe(threadMode = ThreadMode.MAIN)public void snycResult(String msg){if (msg.equals("overWrite")){Log.e(TAG, msg);}else {Log.e(TAG, "影子同步错误");//Toast.makeText(this,"影子同步错误:"+msg,Toast.LENGTH_LONG);}}

此时ThreadMode 线程模式为MAIN模式,在主线程处理事件 , 如果在子线程发送消息 , 处理消息时会将线程切换成主线程 。主要有两种情况:

  • 如果发送事件的线程是 主线程 , 则立刻调用消息处理事件 , 此时 主线程会阻塞 ;
  • 如果发送事件的线程是 子线程 , 事件在队列中排队等待传递 , 不会阻塞发布线程 ;

如果数据库被重写,读取数据库所有数据,更新页面;在数据库未被重写的情况下,学长原使用Toast.makeText(this,“影子同步错误:”+msg,Toast.LENGTH_LONG);来重新发送上一步的请求,继续被阻塞的原主进程,但这样使用是报错的。原因分析如下:在子线程中 使用Toast 弹出消息时,去相应的位置去取对象,子线程根本没有初始化就直接取,结果肯定取不到,所以就会抛出此异常,这就是Toast不能直接在子线程中使用,如果使用的话需要添加prepare()函数。

public void update(List<List<NotifyDataDetails>> list){//list.get(0)是添加的数据的类名和sri//list.get(1)是更新的数据的类名和sri//list.get(2)是删除的数据的类名和sriLog.e(TAG, JSON.toJSONString(list));List<NotifyDataDetails> addDataDetailsList = list.get(0);for (NotifyDataDetails addDetail : addDataDetailsList) {switch (addDetail.getClassName()) {case "SduMedia":SduMedia media = (SduMedia) DaoManager.search(new SduMedia(), addDetail.getSri());if (media == null) {Log.e(TAG, "收到一个空的media,信息如下: " + JSON.toJSONString(addDetail));continue;}Log.e(TAG, media.getPath());if (!media.getDownloaded()) {MinioUtil.downloadByUrl(media.getPath(), (InputStream is) -> {if (is != null) {Log.e(TAG, "file separator " + File.separator);String[] strs = media.getPath().split(File.separator);String fileName = strs[strs.length - 1];FileUtil.saveFile(is, fileName);media.setDownloaded(true);media.setAnPath(FileUtil.path + File.pathSeparator + fileName);DaoManager.update(media);ShadowFactory.notifyUpdate(media);}});}break;}}

这个方法主要管理的是柜子端界面上宣传展示的部分(主要是宣传图)。media是自定义的一个媒体文件对象。if-continue部分主要说明在media文件不存在的时候,则不报错。在media文件存在时,如果这个媒体文件没有被下载到本机立即发起网络请求,下载这个文件到本机,完成后执行回调。使用

media.setDownloaded(true);
media.setAnPath(FileUtil.path + File.pathSeparator + fileName);
DaoManager.update(media);
ShadowFactory.notifyUpdate(media);

更新影子中,当前media的downloaded标志位,同时更新文件存放位置url;更新数据库;发送到后台,并通知前端媒体组件,更新媒体列表

2019级软件工程应用与实践-人工智能快递柜(代码分析7)相关推荐

  1. 2019级软件工程应用与实践-人工智能快递柜(代码分析2)

    2021SC@SDUSC 第一篇博客中学习了Android Studio的基本使用方式. 第二篇主要是利用了第一周的部分时间和第二周的全部时间来学习Android开发所需要的语法,通过学习,终于可以看 ...

  2. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(七)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型 学习论文: <ProtTrans: Towards Cracking the Language of Life' ...

  3. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(十二)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型(6) 代码分析 Benchmark Section ProtTrans/Benchmark/ProtAlbert.ip ...

  4. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(八)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型(2) 代码分析 根据使用方法,将按照以上顺序对每部分代码进行分析. 特征提取 : Embedding Section ...

  5. 人工智能研究中心快递柜——代码分析七

    2021SC@SDUSC 目录 index.wxml index.js 本次分析项目中柜子的定位功能的实现. index.wxml 在微信官方开发文档中,提供了map组件,通过对wx.createMa ...

  6. 人工智能研究中心快递柜——代码分析八

    2021SC@SDUSC 本次开始介绍柜子的具体使用功能的实现. 由于关于wxml方面都是使用view标签设置相应参数,进行展示故不做具体分析,主要是对 wx:if的运用,合理使用js中传入的数据参数 ...

  7. 山东大学软件工程应用与实践——GMSSL开源库(四)——SM9数字签名算法及验证的源代码分析

    2021SC@SDUSC 目录 一.引言 二.密钥的生成数字签名与签名验证相关代码 1.判定函数 2.签名的初始化函数 3.签名执行函数 4.真正的签名函数 5.签名验证初始化函数 6.签名验证执行函 ...

  8. 软件工程应用与实践(15)——请求与响应

    2021SC@SDUSC 文章目录 一.概述 二.源码分析 2.1 响应 2.2 请求 三.总结 一.概述 在老年健康知识图谱系统中,后端与前端的交互是很重要的,在前端向后端发送请求的过程中,后端需要 ...

  9. 《3D数学基础》实践1 向量类代码分析

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  10. 山东大学软件工程应用与实践——GMSSL开源库(一) ——WINDOWS下GMSSL的安装与编译的超详细保姆级攻略

    2021SC@SDUSC GMSSL简介 GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法.SM2国密数字证书及基于SM2证书的SSL/TLS安全 ...

最新文章

  1. Facebook 开源 SlowFast:基于双帧速率分治轻量视频识别模型
  2. 关于常用mysql的文件
  3. 【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )
  4. C++之map的前后遍历
  5. springboot mysql时区设置_java/springboot/mysql时区问题解决方案
  6. python获取mysql数据为excel中的sheet_python 从excel、csv、mysql、txt获取数据源
  7. 【codevs1036】商务旅行,LCA练习
  8. 绑定MAC地址 局域网防arp ARP病毒
  9. ClickHouse大数据分析技术与实战
  10. DNF的SPK文件解析笔记
  11. A-priori算法
  12. 让 Flutter 在鸿蒙系统上跑起来
  13. 深耕地产 20 年,拿下90%头部客户,“明源云”能为垂直行业 SaaS 带来哪些启发?
  14. Linux rar 压缩 解压文件
  15. 基于PaddleX构建专属行车助手,为交通安全保驾护航
  16. 【flutter】上架马甲包过审
  17. Java实习生常规技术面试题每日十题Java基础(六)
  18. Android APK反编译哟~~~
  19. 面试经验|计算机网络面试相关知识
  20. DistributedDataParallel(DDP)Pytorch 分布式训练示例及注意事项

热门文章

  1. 软件测试题目 如何测一个三角形,软件测试三角形问题(覆盖测试)
  2. php 工商银行公众号支付代码_微信支付 —— 公众号支付代码详解(1/7)
  3. 库存控制系统(inventory control system)
  4. 最新python面试题180题完整版带答案(转载加整理)
  5. antd自定义样式主题
  6. Excel之动态数据分析报表
  7. 计算机如何连接iphone,iphone怎么连接到电脑的方法详解【图文】
  8. 政府转型迎来大数据时代 打破部门“信息孤岛”
  9. 作为兼并重组的重要方式之一,企业合并、分立的具体形式?
  10. python实现文件重命名_python实现文件重命名