Android中实现异步轮询上传文件
前言
前段时间要求项目中需要实现一个刷卡考勤的功能,因为涉及到上传图片文件,为加快考勤的速度,封装了一个异步轮询上传文件的帮助类
效果
先上效果图

设计思路

数据库使用的框架是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
Android中实现异步轮询上传文件的更多相关文章
- ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案
摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置 ...
- python中使用multipart/form-data请求上传文件
最近测试的接口是上传文件的接口,上传单个文件,我主要使用了2种方法~ 接口例如: URL: http://www.baidu.com/*** method:post 参数: { "salar ...
- 不使用ASP.NET中的服务器控件将如何上传文件?
遇到文件的上传时,可能会有大部分的开发者喜欢使用服务器控件,虽然很方便,但是却不能很好的控制,不具灵活性. 现给出例子,使用html标签语言灵活的控制文件的上传. 1.html部分 <input ...
- 在MVC中利用uploadify插件实现上传文件的功能
趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同 ...
- Ubuntu18.04中安装vsftpd服务/ ftp上传文件提示无权限 553 Could not create file.
1,安装 $ sudo apt-get install vsftpd 2.配置 备份并创建新的配置文件. $ sudo mv /etc/vsftpd.conf /etc/vsftpd.conf_ori ...
- MFC中使用post提交form-data上传文件
已经有将近6年时间没写过MFC了,想想以前我也是写VC++入门程序开发的,那时候写协议栈.搞语音编码.做视频压缩和实时数据传输,相比现在更多偏业务的开发,那时候搞得都是非常技术的东西.眨眼间,MFC已 ...
- web 中常用的两种上传文件的方法总结
这里我们来总结整理一下常用的两种文件上传方式以及要注意的东西: 1.springmvc .MultipartFile 的上传方式. 2.org.apache.commons.fileupload 使用 ...
- MapReduce中使用SequenceFile的方式上传文件到集群中
如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗, MapRedu ...
- C#远程执行Linux系统中Shell命令和SFTP上传文件
一.工具:SSH.Net 网址:https://github.com/sshnet/SSH.NET 二.调用命令代码: Renci.SshNet.SshClient ssh = "); ss ...
随机推荐
- SpringBoot学习(三)—— springboot快速整合swagger文档
目录 MyBatis 简介 引入mybatis组件 代码实战 MyBatis @ 简介 优点 最大的优点是SQL语句灵活,适合调优情景,业务复杂情景 劣势 最大的劣势是不同数据库之间的迁移 引入myb ...
- ubuntu 16.04上源码编译dlib教程 | compile dlib on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/c6ead512/,欢迎阅读! compile dlib on ubuntu 16.04 Series Part 1: compil ...
- 白话布隆过滤器BloomFilter
通过本文将了解到以下内容: 查找问题的一般思路 布隆过滤器的基本原理 布隆过滤器的典型应用 布隆过滤器的工程实现 场景说明: 本文阐述的场景均为普通单机服务器.并非分布式大数据平台,因为在大数据平台下 ...
- HTTP 协议漫谈
转载出处:HTTP 协议漫谈 简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 HTTP 协 ...
- python3之递归实例
一.利用递归求: 1+2+3+4+5...+n的前n项和 def recursion_sum_1(n): #当n = 1:和为1 #否则,n的和等同于 n + (n -1) if n == 1: re ...
- 【2018寒假集训 Day2】【动态规划】抢金块
抢金块 输入文件:gold.in 输出文件:gold.out 问题描述: 地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步 .如果S=2,T=4.你就可以跳 ...
- 学习Python第一天:找了4本专属小白的书籍(前期入门打基础)
我们提供一个初学者最好的Python书籍列表.Python是一个初级程序员可以学习编程的最友好语言之一.为了帮助您开始使用Python编程,我们分享此列表.泡一杯茶,选一本书阅读,开始使用Python ...
- kubectl: Error from server: error dialing backend: remote error: tls: internal error
使用kubectl logs,发现报了tls的错误,然后查看kubelet的日志,发现报了上面的错误,然后通过命令kubectl get csr查看发现有很多处于pending状态 最后通过命令 ku ...
- 用 python 分析基金!让赚钱赢在起跑线!
你不理财,财不理你!python 也能帮你理财? 效果预览 累计收益率走势图 基本信息结果 如何使用: python3 + 一些第三方库 import requests import pandas i ...
- 英语口语考试资料College life
College life Early in senior high school, we longed to be enrolled in a university. Now the dream ha ...