内容简介:作者: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在上传前压缩图片
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Coding the Matrix
Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00
An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!