Android中實(shí)現(xiàn)異步輪詢上傳文件

前言

前段時(shí)間要求項(xiàng)目中需要實(shí)現(xiàn)一個(gè)刷卡考勤的功能,因?yàn)樯婕暗缴蟼鲌D片文件,為加快考勤的速度,封裝了一個(gè)異步輪詢上傳文件的幫助類(lèi)

效果

先上效果圖

image

設(shè)計(jì)思路

image

數(shù)據(jù)庫(kù)使用的框架是GreenDao,一個(gè)非常好用的東西

先創(chuàng)建一個(gè)GreenDao的數(shù)據(jù)表的實(shí)體

來(lái)保存我們的考勤記錄,我這邊只寫(xiě)了一下幾個(gè)參數(shù),方便大家觀看,使用的時(shí)候大家記得要編譯一下來(lái)生成Dao文件跟get,set方法

@Entity
public class Attendance {

    @Id(autoincrement = true)
    public Long id;

    /**
     * 是否已上傳
     * */
    public Boolean isUpload;

    /**
     * 文件路徑
     * */
    public String path;

    /**
     * 姓名
     * */
    private String name;

    /**
     * 考勤時(shí)間
     * */
    private Date attendanceDate;

}

幫助類(lèi)的實(shí)現(xiàn)

首先是輪詢線程判斷是否運(yùn)行

    /**
     * 開(kāi)啟上傳線程
     */
    public void startUpThread() {
        if (!isRun) {
            return;
        }
        singleThreadExecutor.execute(upRunnable);
    }

線程需要注意內(nèi)存泄露,這個(gè)是必須的

    /**
     * 自建一個(gè)Runnable判斷activity是否銷(xiāo)毀,防止內(nèi)存泄露
     * */
    private class UpRunnable implements Runnable {

        private WeakReference<Activity> activityWeakReference;

        public UpRunnable(Activity activity) {
            //使用弱引用賦值
            activityWeakReference = new WeakReference<>(activity);
        }

        @Override
        public void run() {
            //判斷activity是否已銷(xiāo)毀
            if (activityWeakReference.get() != null){
                upRecord();
            }
        }
    }

先查詢隊(duì)列判斷是否有數(shù)據(jù)需要上傳

沒(méi)有需要上傳的數(shù)據(jù)延遲兩秒后從數(shù)據(jù)庫(kù)查詢并填充隊(duì)列

開(kāi)始下一次的輪詢

    private void upRecord() {
        Attendance Attendance = queue.poll();
        if (null == Attendance) {
            //沒(méi)有需要上傳的文件
            LogUtils.d("上傳隊(duì)列為空 2秒后開(kāi)始 檢查是否存在上報(bào)");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handleLocalAttendance();
            startUpThread();
        } else {
            //有需要上傳的文件,回調(diào)給頁(yè)面
            if (onUploadListener != null) {
                onUploadListener.onUpload(Attendance);
            } else {
                startUpThread();
            }
        }
    }

查詢數(shù)據(jù)庫(kù)的代碼

    /**
     * 查詢是否有上傳任務(wù)
     */
    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);
        }
    }

幫助類(lèi)的使用

首先是先在初始化幫助類(lèi)

        UploadHelper uploadHelper = new UploadHelper(this);
        uploadHelper.setOnUploadListener(new OnUploadListener() {
            @Override
            public void onUpload(Attendance attendance) {
                //有需要上傳的文件
                uploadToServer(attendance);
            }
        });
        uploadHelper.startUpThread();

接口調(diào)用成功后標(biāo)記成功,開(kāi)始下一次的輪詢

uploadHelper.uploadSuccess(dataModel);

在打卡回調(diào)中添加數(shù)據(jù)庫(kù)記錄,這樣輪詢線程就會(huì)查到

//數(shù)據(jù)庫(kù)
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,641評(píng)論 1 32
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 6,017評(píng)論 1 19
  • 不足的地方請(qǐng)大家多多指正,如有其它沒(méi)有想到的常問(wèn)面試題請(qǐng)大家多多評(píng)論,一起成長(zhǎng),感謝!~ String可以被繼承嗎...
    啟示錄是真的閱讀 3,067評(píng)論 3 3
  • 人無(wú)完人,每個(gè)人都有劣勢(shì)。很多時(shí)候,困住我們的并不是劣勢(shì)本身,而是我們對(duì)待它的態(tài)度。不妄自菲薄,不自暴自棄,有勇氣...
    小號(hào)熱水袋閱讀 448評(píng)論 0 0
  • 我相信,每個(gè)人都有許許多多個(gè)難忘的事。有快樂(lè)的、有傷心的、有痛苦的、也有有趣的,總之有酸、有甜、有苦、也有辣。 ...
    何靜沙閱讀 124評(píng)論 0 1

友情鏈接更多精彩內(nèi)容