Android 中自动同步的机制的简单的demo,例如订单同步,商品同步,会员同步,操作同步

Android购物商城项目 网络商城APP,实现购买,加入购物车,移除商品,实现短信验证登录和定位 阅读详情
说白了,自动同步就是几个线程自动的过一段时间执行一次看看服务器端有没有更新而已。也就是每过一段时间执行一次线程。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0:自动同步就是每过一段时间和服务器进行一次请求而已,也就是执行一次线程的程序,线程里面进行网络请求。

这里的demo,只是demo了执行线程,里面没有网络请求,

还有这里为了方便是设置了一个按钮,其实可以直接放在onCreate方法里面的。

Android 中自动同步的机制的简单的demo0



1:其实应该是要有网络请求的,网络请求后,然后保存这次请求的时间,作为最后的时间lastTime,保存到特定给的表中,
下一次请求的时候查找这个表,将这个最后的时间lastTime发送给服务器,服务器会查找该时间点之后个数据给我们。

一定要记住的是要保存这个lastTime


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MainActivity:

这里为了方便是设置了一个按钮,其实可以直接放在onCreate方法里面的。

package tech.androidstudio.autosync;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import tech.androidstudio.autosync.schedule.ServiceContext;

public class MainActivity extends AppCompatActivity {
    private Handler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mHandler = new Handler();
    }

    public void syncBtn(View view) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                ServiceContext.getScheduleEngine().start();
            }
        });
    }
}


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="tech.androidstudio.autosync.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自动同步按钮"
        android:onClick="syncBtn"/>
</RelativeLayout>

接口:

package tech.androidstudio.autosync.schedule.engine;

/**
 * Created by Kodulf on 2016/7/5.
 */
public interface Schedule {
    public void startSync();
}


引擎:

在同步engine 的线程(每30分钟执行一次)启动的时候会去启动另外四个同步的线程,这些线程都是有固定的更新的时间的

package tech.androidstudio.autosync.schedule.engine;

import android.util.Log;

import tech.androidstudio.autosync.schedule.CustomerSchedule;
import tech.androidstudio.autosync.schedule.ServiceContext;

/**
 * Created by Kodulf on 2016/7/5.
 */
public class ScheduleEngine {

    private Thread mScheduleEngine;

    public void start(){
        if(mScheduleEngine ==null){
            mScheduleEngine = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        Log.d("kodulf","同步引擎启动了 "+Thread.currentThread().getName());

                        startSync(ServiceContext.getOperatorSchedule());
                        startSync(ServiceContext.getCustomerSchedule());
                        startSync(ServiceContext.getRetailItemSchedule());
                        startSync(ServiceContext.getRetailOrderSchedule());
                        try {
                            Thread.sleep(30*60*1000);
                        } catch (InterruptedException e) {
                            try {
                                Thread.sleep(30*60*1000);
                            } catch (InterruptedException e1) {
                                e1.printStackTrace();
                            }
                            e.printStackTrace();
                        }
                    }
                }
            });
            //注意start要在这里
            mScheduleEngine.start();
        }
        //start 不能在这里,不然会报错
        //mScheduleEngine.start();

        if(Thread.State.TERMINATED.equals(mScheduleEngine.getState())){
            mScheduleEngine.start();
        }


    }

    public void startSync(Schedule schedule){
        schedule.startSync();
    }
}

ServiceContext:

package tech.androidstudio.autosync.schedule;

import tech.androidstudio.autosync.schedule.engine.ScheduleEngine;

/**
 * Created by Kodulf on 2016/7/6.
        */
public class ServiceContext {

    private static OperatorSchedule operatorSchedule = new OperatorSchedule();
    private static RetailItemSchedule retailItemSchedule = new RetailItemSchedule();
    private static RetailOrderSchedule retailOrderSchedule = new RetailOrderSchedule();
    private static CustomerSchedule customerSchedule = new CustomerSchedule();
    private static ScheduleEngine scheduleEngine = new ScheduleEngine();

    public static ScheduleEngine getScheduleEngine() {
        return scheduleEngine;
    }

    public static OperatorSchedule getOperatorSchedule() {
        return operatorSchedule;
    }

    public static RetailItemSchedule getRetailItemSchedule() {
        return retailItemSchedule;
    }

    public static RetailOrderSchedule getRetailOrderSchedule() {
        return retailOrderSchedule;
    }

    public static CustomerSchedule getCustomerSchedule() {
        return customerSchedule;
    }
}

会员同步:

package tech.androidstudio.autosync.schedule;

import android.util.Log;

import tech.androidstudio.autosync.schedule.engine.Schedule;

/**
 * Created by Kodulf on 2016/7/5.
 * 会员的同步
 */
public class CustomerSchedule implements Schedule {
    private Thread customerScheduleThread;
    @Override
    public void startSync() {
        if(customerScheduleThread ==null){
            customerScheduleThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        Log.d("kodulf","客户的同步开始了 30分钟一次"+Thread.currentThread().getName());
                        //TODO 网络请求,记住保存lastTime,就是最后更新的时间,保存到特定的表中,
                        // TODO 注意不同的同步线程的lastTime肯定是表中的不同的数据

                        try {
                            Thread.sleep(30*60*1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            //注意start要在这里
            customerScheduleThread.start();
        }
        //start 不能在这里,不然会报错
        //customerScheduleThread.start();
        if(Thread.State.TERMINATED.equals(customerScheduleThread.getState())){
            customerScheduleThread.start();
        }
    }
}

操作同步:

package tech.androidstudio.autosync.schedule;

import android.util.Log;

import tech.androidstudio.autosync.schedule.engine.Schedule;

/**
 * Created by Kodulf on 2016/7/5.
 * 操作的同步
 */
public class OperatorSchedule implements Schedule {
    private Thread operatorScheduleThread;
    @Override
    public void startSync() {
        if(operatorScheduleThread ==null){
            operatorScheduleThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        Log.d("kodulf","操作的同步开始了 一分钟同步一次"+Thread.currentThread().getName());
                        //TODO 网络请求,记住保存lastTime,就是最后更新的时间,保存到特定的表中,
                        // TODO 注意不同的同步线程的lastTime肯定是表中的不同的数据

                        try {
                            Thread.sleep(60*1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            //注意start要在这里
            operatorScheduleThread.start();
        }
        //start 不能在这里,不然会报错
        //operatorScheduleThread.start();
        if(Thread.State.TERMINATED.equals(operatorScheduleThread.getState())){
            operatorScheduleThread.start();
        }
    }
}

商品同步:

package tech.androidstudio.autosync.schedule;

import android.util.Log;

import tech.androidstudio.autosync.schedule.engine.Schedule;

/**
 * Created by Kodulf on 2016/7/5.
 * 商品的同步
 */
public class RetailItemSchedule implements Schedule {
    private Thread retailItemScheduleThread;
    @Override
    public void startSync() {
        if(retailItemScheduleThread ==null){
            retailItemScheduleThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        Log.d("kodulf","商品的同步开始了,30分钟一次 "+Thread.currentThread().getName());
                        //TODO 网络请求,记住保存lastTime,就是最后更新的时间,保存到特定的表中,
                        // TODO 注意不同的同步线程的lastTime肯定是表中的不同的数据

                        try {
                            Thread.sleep(30*60*1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            //注意start要在这里
            retailItemScheduleThread.start();
        }
        //start 不能在这里,不然会报错
        //retailItemScheduleThread.start();
        if(Thread.State.TERMINATED.equals(retailItemScheduleThread.getState())){
            retailItemScheduleThread.start();
        }
    }
}

订单同步:

这里在订单同步中还测试了一下CountDownLatch的使用,
latch.await(30*60*1000, TimeUnit.MICROSECONDS);的方法就是等待latch的countDown,如果没有发生countDown,那么里面的参数就是等待多长时间后自动结束
                           

package tech.androidstudio.autosync.schedule;

import android.util.Log;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import tech.androidstudio.autosync.schedule.engine.Schedule;

/**
 * Created by Kodulf on 2016/7/5.
 * 订单同步
 */
public class RetailOrderSchedule implements Schedule {
    private Thread retailOrderScheduleThread;
    @Override
    public void startSync() {
        if(retailOrderScheduleThread ==null){
            retailOrderScheduleThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        final CountDownLatch latch = new CountDownLatch(1);
                        Log.d("kodulf","订单的latch countDown 之前"+Thread.currentThread().getName());
                        //TODO 网络请求,记住保存lastTime,就是最后更新的时间,保存到特定的表中,
                        // TODO 注意不同的同步线程的lastTime肯定是表中的不同的数据

                        //3482*100 毫秒数,大概是348秒,也就是5分钟多一点
                        for (long i = 0; i < 100000000000l; i++) {
                            if(i==99999999999l){
                                latch.countDown();
                                Log.d("kodulf","订单的latch countDown 之后"+Thread.currentThread().getName());
                            }
                        }
                        try {
                            Log.d("kodulf","订单的Latch执行之前"+Thread.currentThread().getName());
                            //TODO latch.await()的方法就是等待latch的countDown,如果没有发生countDown,
                            // TODO 那么里面的参数就是等待多长时间后自动结束
                            latch.await(30*60*1000, TimeUnit.MICROSECONDS);
                            Log.d("kodulf","订单的Latch执行之后"+Thread.currentThread().getName());

                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        Log.d("kodulf","订单的同步开始了,1分钟一次 "+Thread.currentThread().getName());

                        try {
                            Thread.sleep(60*1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }
            });
            //注意start要在这里
            retailOrderScheduleThread.start();
        }
        //start 不能在这里,不然会报错
        //retailOrderScheduleThread.start();
        if(Thread.State.TERMINATED.equals(retailOrderScheduleThread.getState())){
            retailOrderScheduleThread.start();
        }
    }
}




在同步engine 的线程(每30分钟执行一次)启动的时候会去启动另外四个同步的线程,这些线程都是有固定的更新的时间的
一个帖子教你实现 商品下单、获取商品订单信息、商品送货时发送通知 一体化功能 总览通过无缝数据库结构,在保证数据的可用性、一致性、安全性外,云数据库能够实现数据在客户端和云端之间的无缝同步。云函数提供serverless环境,AppGallery Connect的其他服务为云函数提供事件源。监听事件源可以触发相关函数。您将建立什么在本次codelab中,您将建立一个示例项目用于体验云数据库和云函数。云数据库中数据发生变化时,云函数HTTP触发器触发函数发送通知。流程如下:商品下单。获取商品订单信息。商品送货时,发送通知。 阅读详情

相关推荐

Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接入,今天给大家分享下腾讯旗下的微信支付SDK的接入流程

MichaelX的专栏 7万+

android开源库合集

android开源库合集 1、阿里巴巴开源的自定义viewpager,支持多重动画,横向纵向,多页面显示 项目地址:https://github.com/alibaba/UltraViewPager 2、android版本更新功能。使用retrfit2 rxjava2 okhttp3实现多文件多线程下载(支持断点下载), android版本更新:通知栏更新,对话框更新 兼容8.0 ...

时光荏苒的博客 8万+

Android开发第三方支付微信支付实例集成过程介绍

最近开发的项目需要集成第三方微信支付,于是查看了微信开放平台的开发指南顺利完成,下面为大家分享一下。 一、在集成之前先到微信开放平台拿到以下三个参数: 项目APP ID, 商户平台的商户号MCH_ID, 项目签名(一般是3232位的md5串)。 拿到这三个参数之后就可以开始集成了,添加微信支付官方的包libammsdk.jar。 二:集成微信支付的主要步骤 1

许超的专栏 4297

Android实现计时与倒计时(限时抢购)的几种方法

在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢? 在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但后来考虑在安卓中是否有更佳的方案,于是乎共找到以下五种实现方案,另外还有一种使用CountDownTimer进行计时的方面,我会在单独的文章中进行介绍 效果如图: 方法一

Whatever is worth doing is worth doing well. 3万+

奶茶店微信小程序源码:含线上点单、会员积分、预约到店与完整订单管理

这是一套专为奶茶店设计的微信小程序源码,开箱即用,支持商品展示、购物车添加、在线下单、微信支付、订单状态实时查询及售后申请;用户端涵盖收货地址维护、优惠券领取与核销、积分累计与查看、实体会员卡绑定、到店时间预约、消费评价与晒单等功能;前端页面齐全,包括首页轮播推荐、单品详情页、结算确认页、支付成功反馈页、个人中心、系统消息通知、门店位置与营业信息等;基于原生微信小程序开发,代码结构清晰、注释详尽,兼容主流安卓与iOS机型;部署只需替换AppID、配置合法服务器域名及后台接口地址,即可本地调试或直接上线运营。

lilh34434的博客 252

微信生鲜小程序源码包:含首页/商品页/购物车/订单全流程,带图标与工具函数

直接导入微信开发者工具就能跑起来的生鲜电商小程序代码,覆盖用户从进店浏览到下单完成的全部环节。首页展示轮播图和分类入口,商品列表支持分类筛选,详情页含规格选择和加入购物车功能,购物车可增删改数量并结算,订单页支持查看、取消和支付状态追踪。配套资源齐全,内置常用操作图标(wechat.png、plus.png、trash.png等)、状态标识(green_tri.png、arrowright.png)、品牌logo(icon64_appwx_logo.png)以及播放控制图标(play.png、pause.p

delta的博客 235

android 获取当前时间精确到毫秒的两种方法

在android app开发中,在项目中有些功能需求要求要获取当前时间精确到毫秒,已便于完成功能开发的需要,而在android 的系统api中提供了SimpleDateFormat和Calendar这两个常有获取时间的类,都可以获取时间到毫秒级别,今天就来分享两种方法获取当前时间精确到毫秒的功能。

安卓兼职framework和app工程师的博客 1万+

京东抢茅台代码京东抢茅台代码

京东抢茅台代码,测试可用,供学习使用

Android 多商品订单评价(类似淘宝)

前几日一商城类项目,有一需求,需要对一份订单的里面几个商品进行分别评价(图片,文字内容,星级);以前都是对一份订单所有商品一起评价,那种简单的多; 后来,承蒙老大细心指导,终于弄出来个看起来还算凑活的,还是先贴一下效果图吧。。。 抖动的有点卡,gif图的问题 图片的相关操作展示.gif 具体评价实现 *上面这张图是订单列表,可以看到有几个商品,要对这几个商品进

Morling0811的博客 4100

Android 线程同步Demo

Android 线程同步Demo,具体介绍请查看博客,http://blog.youkuaiyun.com/u011315960/article/details/70209621

android 仿订单出票效果

android 仿订单出票效果 相关帖子所在博客:http://blog.youkuaiyun.com/vipzjyno1

android商品提交订单页面功能,android使用protobuf实现网络订单管理功能

在新版本的Beetle.NetPackage开源组件中集成了对Protobuf的支持,在android下可以简单地使用Beetle.NetPackage实现基于Protobuf的TCP通讯数据交互.下详细讲解实现一个网络订单管理功能的过程.协议定义既然使用Probobuf进行数据交互,那就需要基于Protobuf制定一系列的通信对象,主要包括数据请求和应答的数据对象格式.在做之前需要把需求整理一下...

weixin_39781143的博客 406

Android 中自动同步的机制的简单的demo

说白了,自动同步就是几个线程自动的过一段时间执行一次看看服务器端有没有更新而已。也就是每过一段时间执行一次线程。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 0:自动同步就是每过一段时间和服务器进行一次请求而已,也就是执行一次线程的程序,线程里面进行网络请求。 这里的demo,只是demo了执行线程,里面没有网络请求,

Android 仿淘宝商品详情页下拉足迹Demo

DropDownMultiPager仿淘宝等商品详情页下拉足迹效果SimpleDemo 可colne之后看MainActivity的调用,方便二次开发 依赖compile 'com.nineoldandroids:library:2.4.0'使用开源下拉框架:ultraPullToRefash演示请看screenShotGit地址:https://github.com/YaphetZhao/Dro

Yaphet 4181

Android 实现定时器的四种方式总结及实现实例

主要介绍了Android 实现定时器的四种方式总结及实现实例的相关资料,这里对定时器进行详解,并附实例代码,需要的朋友可以参考下

三种 绘制奈奎斯特曲线 的方法

如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制

weixin_46664967的博客 6万+

带MD5加密的原生登录注册到购物车到订单Demo

一,项目介绍首先看项目流程(接口都写在model类中,不提出来一一写了)二,项目思路分析可以看出框架为MVP,主要思路是:1,MD5加密的登录注册。2,登陆成功后跳转到RecyclerView+网络请求(Okhttp+Retrofit+Rxjava)+Fresco显示图片实现的商品列表。3,点击列表条目跳转到详情页面。4,点击详情页面中的添加购物车,提示加购成功,点击购物车,商家和商品信息显示在购

androidyhr的博客 2589

LFM调制信号分类与检测识别

支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗干扰(DDJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)。Faster-RCNN支持检测识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)等8种信号。

菜yuan~的博客 1029

基于SpringBoot+Vue的超市会员购物商城系统毕业设计项目源码

当前超市会员服务存在体验单一、数字化程度低等问题。消费者在超市购物时,会员权益仅局限于积分兑换,65% 的会员反馈优惠信息获取滞后,40% 的用户因会员体系繁琐降低消费意愿。传统超市缺乏对会员消费数据的深度分析,难以提供个性化服务,35% 的消费者表示未感受到会员专属价值。同时,线上线下购物渠道割裂,会员积分、优惠难以跨场景使用,影响购物便利性。基于 SpringBoot+Vue 的超市会员购物商城系统依托前后端分离架构优势,构建 “线上 + 线下” 融合的会员服务平台。系统支持会员积分管理、消费数据分析、

专注于大学生项目实战开发,讲解,毕业答疑辅导,java就业辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。全网粉丝10w+,平台优质创作者。 815

SAP Fiori 从技术上而言到底包含哪些组件?

SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 182
上一篇: Android 从文件中批量导入数据,个人记录而已
下一篇: 装修新软件,666的
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值