代碼重構的痛點之框架切換技術-一分鐘完成別人一個月的工作量

????由于工作原因畔况,簡書已經有一年左右沒有維護更新了,在這一年當中我也受益匪淺(有點夸張慧库,但也確實收獲了不少)跷跪,這里我也將自己的收獲給大家稍作分享,希望能夠幫助到大家齐板。
????首先吵瞻,本文內容主要面向中高端的安卓開發(fā)者,如果你是壓根兒沒參與過項目的小白甘磨,或者是最基本的幾個框架也沒用過的听皿,那么請別浪費你寶貴的時間,等有一定的經驗后再回過頭來看本文宽档,因為現(xiàn)在的你看的肯定暈頭轉向還學不到任何東西。
????本文主要用到了一種比較普遍的代理思想庵朝,由于不能放超鏈接吗冤,所以關于設計模式這些,本文一概不講九府。
????代理模式就好比我們生活中的房地產行業(yè)椎瘟,客戶買房一般都會選擇去尋找房地產公司,而實際上在落實賣房這項工作的是房產公司的業(yè)務員侄旬,業(yè)務員需要從有房可賣的人肺蔚,那么,我們客戶這邊也就不用東跑西跑找房子儡羔,節(jié)省大量的精力和時間宣羊,在這個過程中,房產公司以及業(yè)務人員就起到了中介的作用汰蜘,也就是我們的代理仇冯。
????以上場景在我們應用程序中,APP就相當于是客戶族操,然后我這個客戶APP(客戶)要進行網絡請求(買房)苛坚,就需要用到一個抽象層(房產公司),然后由這個抽象層去尋找具體的網絡請求的邏輯代碼色难。這樣一來泼舱,我們的activity層就不用頻繁的去改動邏輯代碼,就能夠很方便的去切換網絡框架枷莉。如果我們一開始就使用了這樣的架構娇昙,那么以后維護升級將會事半功倍。


image

下面是一段簡單的請求代碼:以retrofit請求框架為例

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
?
    <Button
        android:id="@+id/btnRequest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="請求"/>
?
</LinearLayout>
/**
 * 
 * 買房的客戶
 * @author logcat
 */
public class MainActivity extends FragmentActivity implements ICallback {
?
    private Button btnRequest;
    private HttpProcessor httpProcessor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnRequest = findViewById(R.id.btnRequest);
        
        //尋找一家房地產公司并且委托他們購房任務
        httpProcessor = new HttpProcessor(this , this);
        btnRequest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //房產公司派人找房
                httpProcessor.request();
            }
        });
    }
?
    /**
     * 買到房后走這個方法
     * @param o 買到的房子
     */
    @Override
    public void onSuccess(Object o) {
        
        //裝修一下房子
        TestModel model = (TestModel) o;
    }
?
    @Override
    public void onFail(Exception e) {
        //買不到房了
    }
}
?
/**
 * 
 * 代理類(房產公司)
 * @author logcat
 */
public class HttpProcessor {
    private FragmentActivity activity;
    private ICallback callback;
?
    public HttpProcessor(FragmentActivity activity, ICallback callback) {
        this.activity = activity;
        this.callback = callback;
    }
?
?
    /**
     * 這里找到一個賣家
     */
    public void request(){
        RetrofitManager.getDefault().getWxArticle()
                .compose(RxHelper.<BaseModel<List<TestModel>>>observableOnMainThread())
                .subscribe(new RxSubscriber<List<TestModel>>(activity) {
                    @Override
                    public void onSuccess(List<TestModel> testModels) {
                        if(callback != null){
                            callback.onSuccess(testModels);
                        }
                    }
?
                    @Override
                    public void onFail(Exception e) {
                        if(callback != null){
                            callback.onFail(e);
                        }
                    }
                });
    }
}
/**
 * 請求回調(業(yè)務員)
 * @author logcat
 */
public interface ICallback<T> {
    /**
     * 請求成功把數(shù)據(jù)回傳給UI層(業(yè)務員交房)
     * @param t 響應回來的數(shù)據(jù)包
     */
    void onSuccess(T t);
?
    /**
     * 請求失敗
     * @param e
     */
    void onFail(Exception e);
}

????RetrofitManager是一個請求封裝類笤妙,網上有許多相關的文章涯贞,相關內容請自行搜索枪狂,也可以進到我的github中clone相關的代碼,鏈接已附在文章末尾宋渔。
????以上代碼中州疾,網絡請求的實現(xiàn)完全與activity隔離,一定程度上進行了解耦皇拣,如此一來严蓖,假設在未來的某一天需要更換請求框架了,我們可以直接找到代理類氧急,對它進行代碼修改即可颗胡,無需再在activity中東改西改。
????以上為本文的全部內容吩坝,如有錯誤毒姨,歡迎大神們指點和補充。
????代碼已上傳至github钉寝,歡迎star和fork
????github: https://github.com/wzlsz/ProxyDemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末弧呐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嵌纲,更是在濱河造成了極大的恐慌俘枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逮走,死亡現(xiàn)場離奇詭異鸠蚪,居然都是意外死亡,警方通過查閱死者的電腦和手機师溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門茅信,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墓臭,你說我怎么就攤上這事汹押。” “怎么了起便?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵棚贾,是天一觀的道長。 經常有香客問我榆综,道長妙痹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任鼻疮,我火速辦了婚禮怯伊,結果婚禮上,老公的妹妹穿的比我還像新娘判沟。我一直安慰自己耿芹,他們只是感情好崭篡,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吧秕,像睡著了一般琉闪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砸彬,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天颠毙,我揣著相機與錄音,去河邊找鬼砂碉。 笑死蛀蜜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的增蹭。 我是一名探鬼主播滴某,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滋迈!你這毒婦竟也來了霎奢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤杀怠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厅克,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赔退,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年证舟,在試婚紗的時候發(fā)現(xiàn)自己被綠了硕旗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡女责,死狀恐怖漆枚,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情抵知,我是刑警寧澤墙基,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站刷喜,受9級特大地震影響残制,放射性物質發(fā)生泄漏。R本人自食惡果不足惜掖疮,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一初茶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浊闪,春花似錦恼布、人聲如沸螺戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔幼。三九已至,卻和暖如春字支,著一層夾襖步出監(jiān)牢的瞬間凤藏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工堕伪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揖庄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓欠雌,卻偏偏與公主長得像蹄梢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子富俄,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容