Android 中实现异步轮询上传文件

栏目: IT技术 · 发布时间: 4年前

内容简介:作者:GiftedCat链接:https://www.jianshu.com/p/b2b9a3699095

code小生 一个专注大前端领域的技术平台 公众号回复 Android 加入安卓技术群

作者:GiftedCat

链接:https://www.jianshu.com/p/b2b9a3699095

声明:本文已获 GiftedCat 授权发表,转发等请联系原作者授权

前言

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

效果

先上效果图

Android 中实现异步轮询上传文件
image

设计思路

Android 中实现异步轮询上传文件
image

数据库使用的框架是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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CLR via C#

CLR via C#

(美)Jeffrey Richter / 周靖 / 清华大学出版社 / 2010-9 / 99.00元

本书针对CLR和.NET Framework 4.0进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。全书5部分29章。第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以实用特性为主题,第Ⅴ部分花大量篇幅重点介绍线程处理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能应用程序。一起来看看 《CLR via C#》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码