Androidプログラミング:リモート・データベース・データの同期を実現する補助クラスSyncHelper

7365 ワード

Androidプログラミング:リモート・データベース・データの同期を実現する補助クラスSyncHelper
必要:
ローカル・データベースSQLiteのデータは、リモート・データベースに同期されます.同期には、レコードの一部のデータをアップロードおよびダウンロードし、一括操作をサポートすることが含まれます.
分析:
  • 時間が迫っているため、JTDSでデータベースを直接操作しなければならない.他のいくつかの方法(1参照)は書けない.
  • Android接続リモート・データベースは、マルチスレッド・オペレーションを使用する必要があります.
  • さらに、AsyncTask(参照2)とThreadクラス(参照3)のインスタンスオブジェクトが実行されると、スレッド全体が終了するので、再利用するにはnewの1つを再利用する必要があります.
  • 、すなわち、1つ以上のbeanクラスの同期操作を1つのスレッドで完了させるために、各操作に1つのスレッドを作成する必要があります.
  • の2つの非同期操作方法はいずれも可能であり、AsyncTaskで比較的簡単であり、進捗を更新することができる.

  • 参考資料:(前に書いた)
    参考1:データの同期方法
    参考2:リモートデータベースデータ非同期クラスAsyncTasの同期
    参考3:リモート・データベース・データThreadクラスの同期化AsyncTaskの模倣
    以上の資料を総合して、本類が実現する必要がある機能:
  • メインスレッド(UIスレッド)は一度だけ初期化され、以降は複数回同期動作が実行される.
  • プライマリ・スレッドは、同期するオブジェクトを1つまたは複数のオブジェクトに挿入したり、すべてのオブジェクトを削除したりすることができます.
  • バックグラウンド非同期同期動作を実行するには、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     list    = new ArrayList();
        private Connection  conn    = null;
    
        private onSyncCompleted     mOnSyncCompleted    = null;
        private onTSync2Server      mOnTSync2Server     = null;
    
        private SyncAsyncTask mSyncAsyncTask = null;
    
        private class SyncAsyncTask extends AsyncTask {
    
            @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;
        }
    
    }