Rxjava +EventBus 數據庫的異步操作和界面的刷新

1,數據庫的操作核心代碼:
以插入數據庫爲例,本文重點在與數據庫的操作,相關數據庫的創建不做討論

private SqliteOpearRx(Context context) {
        this.context = context;
        mContentResolver = this.context.getContentResolver();
        dbHelper = DBHelper.getInstance(context);
    }

    /**
     * 初始化
     * 
     * @param context
     * @return
     */
    public static SqliteOpearRx getInstance(Context context) {
        if (mSqliteOpearRx == null) {
            synchronized (SqliteOpearRx.class) {
                if (mSqliteOpearRx == null) {
                    mSqliteOpearRx = new SqliteOpearRx(context);
                }
            }
        }
        return mSqliteOpearRx;
    }
//上層直接調用的函數
/**
     * 插入數據庫
     * 
     * @param ObjectBean
     * @return
     */
    public Observable<Integer> useInsertMessage(MessageBean ObjectBean) {
    // 邏輯執行在異步線程中
        return makeObservable(insertSqlMessage(ObjectBean)).subscribeOn(Schedulers.computation());
    }
**
     * 
     * @param mMessageBean
     * @return
     */
    private Callable<Integer> insertSqlMessage(final MessageBean mMessageBean) {
        return new Callable<Integer>() {
            @Override
            public Integer call() {
                // 模板代碼插入數據庫的具體代碼
                int fileType = mMessageBean.getFileType();
                ContentValues values = new ContentValues();
                Uri insertRow = mContentResolver.insert(AllMessageProvider.CONTENT_URI, values);
                /此處還有一個小知識點,以插入數據庫的id作爲bean的唯一標識,避免數據的重複
                int id = (int) ContentUris.parseId(insertRow);
                return id;
            }
        };
    }

//核心的轉化函數  實現callback函數轉爲observable
private <T> Observable<T> makeObservable(final Callable<T> func) {
        return Observable.create(new Observable.OnSubscribe<T>() {

            @Override
            public void call(Subscriber<? super T> subscriber) {
                try {
                    subscriber.onNext(func.call());

                } catch (Exception ex) {

                    Log.e(TAG, "Error reading from the database", ex);

                }

            }
        });
    }

2,作爲工具調用函數

 SqliteOpearRxmDbHelper = SqliteOpearRx.getInstance(mContext);
    //返回結果在主線程中處理
   mDbHelper.useInsertMessage(nImBean).observeOn(AndroidSche dulers.mainThread()).subscribe(new Action1<Integer>() {
                            @Override
                            public void call(Integer id) {
                                if (id != -1) {
                                    Log.d(TAG, "接收到的信息插入數據庫成功 id" + id);
                                    if (nImBean.getMsrpId() == null) {
                                        nImBean.setMsrpId(id + "");
                                    }
                                    nImBean.setId(id);
                                    nImBean.setMsgOpera(MessageBean.MESSAGE_OPERA_ADD);
                                    //通知界面進行刷新
                                    EventBus.getDefault().post(nImBean);
                                }
                            }
                        });
3.Activity中接收查詢的結果進行界面的刷新

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy()");
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

@Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
           Log.d(TAG, "onCreate");
        EventBus.getDefault().register(this);
    }
@Subscribe(threadMode = ThreadMode.MAIN)
    public void getEvent(MessageBean bean) {
//處理自己的界面刷新的邏輯
                + 

}



“`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章