天天看點

一個牛逼哄哄的Android架構One,秒殺最火的Xutils

一個牛逼哄哄的Android架構One

One架構能幫您帶來什麼?

  • One架構分為兩個項目,OneCore為核心工程,androidOne為示範項目,依賴oneCore
  • One整個架構為MVC模式搭建,基于android framework為核心,內建Android世界中的主流技術選型
  • 以Pragmatic風格的Android應用參考示例,是android項目最佳實踐的總結與示範
  • 以“複雜的世界裡,一個就夠了”為理念,勵志幫助Android開發人員快速搭建一個簡單高效的android開發架構!

異步子產品

  • 封裝EventBus類,将異步架構單獨抽出來,任何耗時操作(不僅僅是網絡請求)都可以放到異步子產品裡
  • 與網絡子產品分離實作,可以直接寫單元測試類測試接口,讓接口調試更友善
  • 支援多并發、取消操作
  • 多個請求,一個回調接口處理,讓頁面代碼更簡潔
  • 建議一般在BaseActivity、BaseFragment中實作
    • 實作參考類 AsyncTaskManager.java
    • 使用參考類 BaseActivity.java
    • 使用參考類 BaseFragment.java

HTTP請求子產品

  • 采用第三方AsyncHttpClient方案,支援http、https方式,支援get、post、put、delete方法,支援GZIP、File格式,支援Retry、Cacel政策,堪稱完美!
  • 改造實作SyncHttpClient,支援同步,并支援RESTFUL風格,調接口時可直接單元測試
    • 實作參考類 SyncHttpClient.java

DownloadManager資源下載下傳子產品

  • 改造實作BreakpointHttpResponseHandler支援多并發、多檔案上傳、斷點續傳、暫停、繼續、删除下載下傳任務
/**
     * [下載下傳器管理類,支援并發、暫停、繼續、删除任務操作以及斷點續傳]
     * 
    DownloadManager downloadMgr = DownloadManager.getInstance();
    downloadMgr.setDownLoadCallback(new DownLoadCallback(){

        @Override
        public void onLoading(String url, int bytesWritten, int totalSize) {
            super.onLoading(url, bytesWritten, totalSize);
        }

        @Override
        public void onSuccess(String url) {
            super.onSuccess(url);
        }

        @Override
        public void onFailure(String url, String strMsg) {
            super.onFailure(url, strMsg);
        }
    });

    //添加下載下傳任務
    downloadMgr.addHandler(url);
    * 
    **/      

BluetoothManager藍牙處理子產品

/**
     * [藍牙管理類]
     * 
     */
    BluetoothManager bluetoothManager = BluetoothManager.getInstance(new BluetoothCallBack(){
        @Override
        public void onStateChange(int bluetoothState, String message) {
            switch(bluetoothState){
                //藍牙不可用
                case BluetoothService.STATE_UNAVAILABLE:
                    NToast.shortToast(mContext, "藍牙不可用");
                    break;

                //藍牙未連接配接
                case BluetoothService.STATE_NONE:
                    NToast.shortToast(mContext, "藍牙未連接配接");
                    break;

                //藍牙空閑
                case BluetoothService.STATE_LISTEN:
                    break;

                //藍牙正連接配接
                case BluetoothService.STATE_CONNECTING:
                    NToast.shortToast(mContext, "藍牙正連接配接");
                    break;

                //藍牙已連接配接, 當如果連接配接上了,message就是藍牙的名稱
                case BluetoothService.STATE_CONNECTED:
                    NToast.shortToast(mContext, "藍牙已連接配接");
                    mBluetoothState = true;
                    break;
            }
        }

        @Override
        public void onResult(int requsetCode, String data) {
            //回調結果在頁面顯示

        }
    });

    //發送藍牙請求
    bluetoothManager.request(SEND_INL_CODE, charStr);

    //斷開
    bluetoothManager.stop();
      

Common子產品

  • 頁面堆棧管理ActivityPageManager
  • 各種自定義dialog
  • 支援hybrid開發
  • 各種工具類
  • 各種動畫效果

SharedPreferences管理

  • 支援直接put、get對象。

LruCache管理

  • 封裝LruCache,隻緩存CACHE_SIZE大小的數量,超過CACHE_SIZE自動釋放前面的對象,建議頁面間傳參使用。

Exception系統異常處理

  • Bugtags是新一代的、專為移動測試而生的缺陷發現及管理工具。移動App內建Bugtags SDK後,測試人員就可以直接在App裡所見即所得的送出 bug,SDK會自動截屏、收集App運作時資料,如:裝置資訊,控制台資料,使用者的操作步驟等,團隊人員在Bugtags雲端高效的跟蹤及管理bug。

Parse解析管理

  • 支援XML、JSON、JSOAP解析
  • 一行代碼輕松轉JAVA對象
    • 采用fastjson實作java、json互轉
    • 采用xstream實作Java、xml互轉,支援注解解析
    • 自主封裝,支援soapObject轉Java對象

CacheManager緩存管理

  • 磁盤緩存,緩存對象需實作序列化接口,提供讀取、失效,清除方法。一般用于對接口資料的緩存。
/**
     * 緩存使用示例
     * 
     * @return
     * @throws HttpException
     */
    public AdResponse getAdList() throws HttpException {
        AdResponse response = null;

        RequestParams params = getRequestParams();
        params.put("method", "fmms.getAdvertisementList");
        params.put("data", "{}");

        //根據請求得到唯一的緩存Key
        String key = getCacheKey(AdResponse.class.getSimpleName());

        //讀取緩存
        if(CacheManager.isInvalidCache(key, INVALID_TIME_1DAY)){
            response = CacheManager.readObject(key);
            if(response != null && response.isSuccess()){
                 return response;
            }
        }

        String result = httpManager.post(mContext, Constants.DOMAIN, getSignParams(params), ContentType);
        if(!TextUtils.isEmpty(result)){
            //一句話解析成對象
            response = jsonToBean(result, AdResponse.class);
            if(response != null && response.isSuccess()){
                 //擷取資料成功,寫入緩存
                CacheManager.writeObject(response, key);
            }
        }

        //最後都沒有資料,還是從緩存中取
        if(response == null){
            response = CacheManager.readObject(key);
            if(response != null && response.isSuccess()){
                return response;
            }
        }

        return response;
    }      

BroadcastManager廣播管理

  • 為了發送廣播更加友善,自主封裝了BroadcastManager,友善好用。
/**
     * [BroadcastManager使用示例]
     * 
    //在任何地方發送廣播
    BroadcastManager.getInstance(mContext).sendBroadcast(FindOrderActivity.ACTION_RECEIVE_MESSAGE);

    //頁面在oncreate中初始化廣播
    BroadcastManager.getInstance(mContext).addAction(ACTION_RECEIVE_MESSAGE, new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent intent) {
            String command = intent.getAction();
            if(!TextUtils.isEmpty(command)){
                if((ACTION_RECEIVE_MESSAGE).equals(command)){
                    //擷取json結果
                    String json = intent.getStringExtra("result");
                    //做你該做的事情
                }
            }
        }
    });

    //頁面在ondestory銷毀廣播
    BroadcastManager.getInstance(mContext).destroy(ACTION_RECEIVE_MESSAGE);
    * 
    **/      

DB子產品

  • 采用GreenDao詳見ORM方案,直接實作Java Object的CURD方法就可以操作資料庫,非常好用,極力推薦。
  • 實作DBManager,連擷取Dao的代碼都不用寫了,不管通過DaoGenerator生成的對象如何變化,通過DBManager可以讓你拿到任何Dao對象,進而實作資料庫操作。
  • DaoGenerator工程自動生成model、dao、session對象等代碼,拷過來直接使用即可。
/**
     * 資料庫示例
     */
    public void testDB(){

        NoteDao dao = DBManager.getInstance(getContext()).getDaoSession().getNoteDao();

        //add
        for(int i=0; i<=4; i++){
            Note bean = new Note();
            bean.setComment("comment");
            bean.setDate(new Date());
            bean.setText("text");
            dao.insert(bean);
        }

        //udpate
        List<Note> list = dao.loadAll();
        if(!list.isEmpty()){
            Note bean = list.get(2);
            bean.setComment("comment_comment");
            dao.update(bean);
        }

        //query
        if(!list.isEmpty()){
            for(Note note : list){
                NLog.e("testDemo", note.getComment());
            }
        }

        //delete
        if(!list.isEmpty()){
            dao.delete(list.get(0));
        }
    }
      

注解子產品

  • 內建butterknife詳見注解架構,一個No Magic的Android注入架構,用過的人都說好,極力推薦。

支付子產品

  • 內建支付寶支付和微信支付
    • 支付寶示例:用戶端封裝參數,調用支付寶
    String PARTNER = "2088XXXXXXXXXXXX";
        String SELLER = "[email protected]";
        String RSA_PRIVATE = "私鑰";
        PayUtils payutils = new PayUtils(activity, PARTNER, SELLER, RSA_PRIVATE, "伺服器回調訂單位址[異步處理]");
        payutils.setPayListener(new PayListener() {
            @Override
            public void onPayResult(int state, String message) {
    
            }
        });
    
        try {
            payutils.pay("測試商品", "測試商品詳情", "0.01", "唯一訂單号,伺服器生成");
        } catch (Exception e) {
            e.printStackTrace();
        }      
    • 支付寶示例:伺服器封裝所有的參數,傳回url直接調用支付寶
    PayUtils1 payutils= new PayUtils1(BespeakActivity.this, new PayListener() {
            @Override
            public void onPayResult(int state, String message) {
                switch (state) {
                    case PayUtils1.PAY_SUC_CODE:
                        MessageDialog dialog = new MessageDialog(mContext, getString(R.string.bespeak_order_suc));
                        dialog.setConfirmListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                BespeakActivity.this.finish();
                            }
                        });
                        dialog.show();
                        break;
    
                    case PayUtils1.PAY_DOING_CODE:
                    case PayUtils1.PAY_GOODS_CODE:
                    case PayUtils1.PAY_INIT_CODE:
                    case PayUtils1.PAY_FAIL_CODE:
                        NToast.shortToast(mContext, message);
                        break;
                }
            }
        });
        payutils.pay(res.getData().getUrl());      
    • 微信支付示例
    PayReq payReq = res.getData().getPayReq();
        payReq.packageValue = "Sign=WXPay";
        IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
        msgApi.registerApp(Constants.WEIXIN_APP_ID);
        msgApi.sendReq(payReq);      

圖檔下載下傳子產品

  • 采用Fresco解決方案,有關使用情況請參見Fresco詳見
  • 記憶體管理、圖檔的漸進式呈現、Gif圖和WebP格式強大的特性讓你不能自拔!特性詳見

日志

  • NLog日志輸出類
  • config.properties檔案(assets檔案夾下)配置日志開關
#is debug mode, if debug is true that log is open, if debug is false that log is close.
debug=true      

教程

  • 優酷視訊教程位址,非常感謝融雲阿明的辛苦錄制!
  • PPT手把手教程位址

常用網址推薦

Android開發技術周報

http://www.androiddevtools.cn/

android-studio中文站

結語

  • 看到這裡,估計您和您的小夥伴們都驚呆了吧!趕快動手試試吧!
  • 具體使用請參考androidOne示範工程。
  • 我改變不了這個世界!這個世界也休想将我改變!
  • 如果任何問題或者建議,歡迎溝通。
  • QQ群:195104825
  • AndroidOne GitHub位址:https://github.com/devinhu/androidone

繼續閱讀