内容简介:作者:GiftedCat链接:https://www.jianshu.com/p/b2b9a3699095
code小生 一个专注大前端领域的技术平台 公众号回复 Android
加入安卓技术群
作者:GiftedCat
链接:https://www.jianshu.com/p/b2b9a3699095
声明:本文已获 GiftedCat
授权发表,转发等请联系原作者授权
前言
前段时间要求项目中需要实现一个刷卡考勤的功能,因为涉及到上传图片文件,为加快考勤的速度,封装了一个异步轮询上传文件的帮助类
效果
先上效果图
设计思路
数据库使用的框架是GreenDao,一个非常好用的东西
先创建一个GreenDao的数据表的实体
来保存我们的考勤记录,我这边只写了一下几个参数,方便大家观看,使用的时候大家记得要编译一下来生成Dao文件跟get,set方法
@Entity public class Attendance { @Id(autoincrement = true) public Long id; /** * 是否已上传 * */ public Boolean isUpload; /** * 文件路径 * */ public String path; /** * 姓名 * */ private String name; /** * 考勤时间 * */ private Date attendanceDate; }
帮助类的实现
首先是轮询线程判断是否运行
/** * 开启上传线程 */ public void startUpThread() { if (!isRun) { return; } singleThreadExecutor.execute(upRunnable); }
线程需要注意内存泄露,这个是必须的
/** * 自建一个Runnable判断activity是否销毁,防止内存泄露 * */ private class UpRunnable implements Runnable { private WeakReference<Activity> activityWeakReference; public UpRunnable(Activity activity) { //使用弱引用赋值 activityWeakReference = new WeakReference<>(activity); } @Override public void run() { //判断activity是否已销毁 if (activityWeakReference.get() != null){ upRecord(); } } }
先查询队列判断是否有数据需要上传
没有需要上传的数据延迟两秒后从数据库查询并填充队列
开始下一次的轮询
private void upRecord() { Attendance Attendance = queue.poll(); if (null == Attendance) { //没有需要上传的文件 LogUtils.d("上传队列为空 2秒后开始 检查是否存在上报"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } handleLocalAttendance(); startUpThread(); } else { //有需要上传的文件,回调给页面 if (onUploadListener != null) { onUploadListener.onUpload(Attendance); } else { startUpThread(); } } }
查询数据库的代码
/** * 查询是否有上传任务 */ private void handleLocalAttendance() { List<Attendance> attendances = DBHelper.getInstance().getSession().getAttendanceDao() .queryBuilder().where(AttendanceDao.Properties.IsUpload.eq(false)) .list(); if (null != attendances && attendances.size() > 0) { queue.addAll(attendances); } }
帮助类的使用
首先是先在初始化帮助类
UploadHelper uploadHelper = new UploadHelper(this); uploadHelper.setOnUploadListener(new OnUploadListener() { @Override public void onUpload(Attendance attendance) { //有需要上传的文件 uploadToServer(attendance); } }); uploadHelper.startUpThread();
接口调用成功后标记成功,开始下一次的轮询
uploadHelper.uploadSuccess(dataModel);
在打卡回调中添加数据库记录,这样轮询线程就会查到
//数据库 Attendance attendance = new Attendance(); attendance.setPath(Environment.getExternalStorageDirectory() + "/" + "Images/picture.png"); attendance.setIsUpload(false); attendance.setName("张三"); attendance.setAttendanceDate(new Date()); uploadHelper.addRecord(attendance); updateDataList();
最后再贴上源码:https://github.com/Giftedcat/UploadHelpUseDemo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Html5实现文件异步上传
- Html5实现文件异步上传
- ThinkPHP+JQuery实现文件的异步上传
- AjaxUpload v1.3.0 发布,Javascript 异步上传插件
- asp.net使用H5新特性实现异步上传的示例
- axios上传图片,koa2接收保存上传的图片,lrz在上传前压缩图片
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CLR via C#
(美)Jeffrey Richter / 周靖 / 清华大学出版社 / 2010-9 / 99.00元
本书针对CLR和.NET Framework 4.0进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。全书5部分29章。第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能应用程序。一起来看看 《CLR via C#》 这本书的介绍吧!