Android程序设计:实现同步远程数据库数据的辅助类SyncHelper
需求:
本地数据库SQLite里面的数据要同步到远程数据库上。同步包括:上传和下载某个记录的某些数据,支持批量操作。
分析:
- 由于时间紧迫,必须采用JTDS直接操作数据库,其他几种方法(参考1)来不及写。
- Android连接远程数据库必须采用多线程操作。
- 再而由于AsyncTask(参考2)和Thread类(参考3)实例对象一执行完,就结束整个线程,想重用必须重新new一个。
- 也就是每一次操作都必须创建一个线程,可以在一个线程完成一个或多个bean类的同步操作。
- 两种异步操作方法都可以,用AsyncTask相对比较简单,可以更新进度。
参考资料:(之前写的)
参考1:同步数据的几种方法
参考2:同步远程数据库数据异步类AsyncTas
参考3:同步远程数据库数据Thread类模仿AsyncTask
综合以上资料,本类需要实现的功能:
- 主线程(UI线程)只初始化一次,以后就可以多次执行同步操作。
- 主线程可以逐个或者批量插入要同步的对象,或者移除所有对象。
- 执行后台异步同步操作,需要公开一个doJob方法。
- 后台异步操作事件的反馈,每个对象同步完后触发事件,使用对象同步完成后触发事件。
- 支持取消后台异步操作。
- 采用AsyncTask来执行同步操作,触发事件。
- 将异步操作触发的事件转发通知给主线程,方便主线程操作更新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;
}
}