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 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
Spring Boot默认使用Tomcat作为嵌入式的Servlet容器,只要引入了spring-boot-start-web依赖,则默认是用Tomcat作为Servlet容器: <depend ...
- Django 基本使用
Django 基本使用 Django 安装 pip install django Django 创建项目 django-admin startproject 项目名称 Django 创建应用 pyth ...
- 新一代开源即时通讯应用源码定制 运营级IM聊天源码
公司介绍:我们是专业的IM服务提供商!哇呼Chat是一款包含android客户端/ios客户端/pc客户端/WEB客户端的即时通讯系统.本系统完全自主研发,服务器端源码直接部署在客户主机.非任何第三方 ...
- 【Oracle】Oracle ASM管理监控命令
目录 Oracle ASM管理监控命令 目的: 1.查看磁盘组 2.查看目前归档 3.查看ASM的磁盘路径 4. asmcmd Oracle ASM管理监控命令 目的: 查看目前Oracle ASM相 ...
- 根据本地ip获取地理位置,再根据地理位置,获取天气
import json,requestsfrom urllib.request import urlopenfrom pyquery import PyQuery as pqfrom lxml imp ...
- PHP中16个高危函数
php中内置了许许多多的函数,在它们的帮助下可以使我们更加快速的进行开发和维护,但是这个函数中依然有许多的函数伴有高风险的,比如说一下的16个函数不到万不得已不尽量不要使用,因为许多“高手”可以通过这 ...
- (四十六)golang--网络编程(简易的聊天系统)
Go主要的目标之一就是面向大规模后端服务程序,网络通信这块是服务端程序必不可少也是至关键的一部分. 网络编程有两种: (1)TCP Socket编程:是网络编程的主流,之所以叫TCP Socket编程 ...
- 移动端App uni-app + mui 开发记录
前言 uni-app uni-app是DCloud推出的终极跨平台解决方案,是一个使用Vue.js开发所有前端应用的框架,官网:https://uniapp.dcloud.io/ mui 号称最接近原 ...
- 英语口语考试资料Family
I Love my family 12 years ago, I was born in a happy family, there was a gentle father, a beautif ...
- Error creating bean with name 'entityManagerFactory' defined in class path resource解决方案
项目是集成了Spring Boot和Spring Data,然后昨天简单Jpa和Spring Boot配置完成,开始进行公司项目的重构,然后出现了这个问题.当时是在网上找了好久.后来发现时java ...