Android程序设计:实现同步远程数据库数据的辅助类SyncHelper

Android程序设计:实现同步远程数据库数据的辅助类SyncHelper

需求:

本地数据库SQLite里面的数据要同步到远程数据库上。同步包括:上传和下载某个记录的某些数据,支持批量操作。

分析:

  1. 由于时间紧迫,必须采用JTDS直接操作数据库,其他几种方法(参考1)来不及写。
  2. Android连接远程数据库必须采用多线程操作。
  3. 再而由于AsyncTask(参考2)和Thread类(参考3)实例对象一执行完,就结束整个线程,想重用必须重新new一个。
  4. 也就是每一次操作都必须创建一个线程,可以在一个线程完成一个或多个bean类的同步操作。
  5. 两种异步操作方法都可以,用AsyncTask相对比较简单,可以更新进度。

参考资料:(之前写的)

参考1:同步数据的几种方法

参考2:同步远程数据库数据异步类AsyncTas

参考3:同步远程数据库数据Thread类模仿AsyncTask

综合以上资料,本类需要实现的功能:

  1. 主线程(UI线程)只初始化一次,以后就可以多次执行同步操作。
  2. 主线程可以逐个或者批量插入要同步的对象,或者移除所有对象。
  3. 执行后台异步同步操作,需要公开一个doJob方法。
  4. 后台异步操作事件的反馈,每个对象同步完后触发事件,使用对象同步完成后触发事件。
  5. 支持取消后台异步操作。
  6. 采用AsyncTask来执行同步操作,触发事件。
  7. 将异步操作触发的事件转发通知给主线程,方便主线程操作更新UI。

SyncHelper类是结合之前写的AsyncTask和模仿AsyncTask的Thread类。
(T是一个bean对象。)
代码如下:(省略某些业务代码)

import android.os.AsyncTask;
//...
public class SyncHelper {

    public interface onSyncCompleted {
        public void SyncCompleted();
    }

    public interface onTSync2Server {
        public void Sync2Server(T t);
    }

    private List<T>     list    = new ArrayList<T>();
    private Connection  conn    = null;

    private onSyncCompleted     mOnSyncCompleted    = null;
    private onTSync2Server      mOnTSync2Server     = null;

    private SyncAsyncTask mSyncAsyncTask = null;

    private class SyncAsyncTask extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... params) {
            if (list.size() > 0) {
                if (this.isCancelled()) return null;
                    for (T t : list) {
                        if (this.isCancelled()) { return null; }
                        // --save and update to server
                        updateT2Server(t, conn);
                    }
                }
                return "同步完畢";
            } else {
                return "沒有參數";
            }
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (mOnSyncCompleted != null) {
                // --在內部移除時候,要考慮是否外部要用到list的資源。否則在這裡清除。
                // clear();
                mOnSyncCompleted.SyncCompleted();
            }

        }
    };

    private void updateT2Server(T t, Connection conn) {
        if (t != null) {
                String sql="**";
                //--
                if (mOnTSync2Server != null) mOnTSync2Server.SyncT2Server(t);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public SyncHelper() {

    }

    public void doJob() {
        if (list.size() <= 0) return;
        if (mSyncAsyncTask != null && mSyncAsyncTask.getStatus() == AsyncTask.Status.RUNNING) {
            mSyncAsyncTask.cancel(true);
            mSyncAsyncTask = null;
        } else {
            mSyncAsyncTask = new SyncAsyncTask();
            mSyncAsyncTask.execute();
        }
    }

    public void cancelJob() {
        if (mSyncAsyncTask != null) {
            mSyncAsyncTask.cancel(true);
        }
    }

    public void add(String strGUID) {
        //--
    }

    public void add(T t) {
        //--
    }

    public void clear() {
        list.clear();
    }

    public void setOnSyncCompleted(onSyncCompleted onSyncCompletedEventHandler) {
        mOnSyncCompleted = onSyncCompletedEventHandler;
    }

    public void setOnSyncT2Server(onTSync2Server onTSync2ServerEventHandler) {
        mOnTSync2Server = onTSync2ServerEventHandler;
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值