百度seo網(wǎng)站360優(yōu)化大師官方網(wǎng)站
Android 當(dāng)中的 Fragment 協(xié)作解耦方式
文章目錄
- Android 當(dāng)中的 Fragment 協(xié)作解耦方式
- 第一章 前言介紹
- 第01節(jié) 遇到的問題
- 第02節(jié) 繪圖說明
- 第二章 核心代碼
- 第01節(jié) 代理人接口
- 第02節(jié) 中間人 Activity
- 第03節(jié) 開發(fā)者A
- 第04節(jié) 開發(fā)者B
- 第05節(jié) 測試類
第一章 前言介紹
第01節(jié) 遇到的問題
場景介紹:1、在同一個項目開發(fā)過程中, 程序員A 和 程序員B 開發(fā)著不同的功能模塊。2、有一天需要程序員 A 和 程序員B 之間功能模塊, 存在相互的調(diào)用關(guān)系。3、但是這些功能尚未開發(fā)完畢, 還在進(jìn)行中。問題來了:1、在未開發(fā)完畢之前, 如何實(shí)現(xiàn)相互之間能夠調(diào)用呢?2、怎樣才能保證功能的協(xié)作開發(fā), 正確有效的完成呢?試想場景:1、如果程序員 A 直接創(chuàng)建了 程序員B 開發(fā)類的對象, 調(diào)用程序員B 的方法。2、那么假設(shè)有一天程序員B 修改了其功能和操作, 那么程序員A 也被迫需要跟著修改。(依賴關(guān)系很強(qiáng)烈)
第02節(jié) 繪圖說明
問題細(xì)節(jié)介紹
問題的解決方案
第二章 核心代碼
為了簡單直擊問題點(diǎn),我們采用 Java 代碼去模擬 Android 的一些基礎(chǔ)環(huán)境。
第01節(jié) 代理人接口
// 定義中間銜接的接口
public interface IServiceA2B {// 處理點(diǎn)擊姓名的操作, 傳遞兩個參數(shù)void handleClickName(int position, String message);// 處理點(diǎn)擊頭像的操作, 沒有傳遞參數(shù)void handleClickAvert();
}
第02節(jié) 中間人 Activity
// 中間的 Activity 銜接人
public class Activity {// 在初始化 Activity 的 onCreate() 方法的時候, 初始化兩個 Fragmentprivate FragmentA fragmentA;private FragmentB fragmentB;public void onCreate(){// 初始化兩個 FragmentfragmentA = new FragmentA();fragmentB = new FragmentB();// 兩個Fragment 都會持有 Activity的對象fragmentA.onCreateView(this);fragmentB.onCreateView(this);}// 定義中間銜接的接口, 該接口采用內(nèi)部類的方式實(shí)現(xiàn), 便于統(tǒng)一管理。// 如果存在多個 FragmentA.FragmentB.FragmentC.FragmentD...// 可以分別實(shí)現(xiàn)不同的接口方式private final IServiceA2B serviceA2B = new IServiceA2B() {@Overridepublic void handleClickName(int position, String message) {fragmentB.showName(position, message);}@Overridepublic void handleClickAvert() {fragmentB.showAvert();}};// 暴露出接口對象, 給事件發(fā)起者, 持有該接口, 通過接口去調(diào)用具體的實(shí)現(xiàn)。public IServiceA2B getServiceA2B() {return serviceA2B;}
}
第03節(jié) 開發(fā)者A
事件的發(fā)起方。FragmentA
// 總結(jié): 對于事件的發(fā)起者, FragmentA 需要做的三件事情:
// 1. 通過 Fragment 拿到 Activity 的對象。
// 2. 通過 Activity 的對象, 拿到代理接口的對象 service
// 3. 在處理點(diǎn)擊事件的時候, 采用代理接口的對象, 去調(diào)用具體的方法
public class FragmentA {private Activity activity;public void onCreateView(Activity activity){System.out.println("FragmentA.onCreateView");this.activity = activity;buttonClickAvert();buttonClickName(66, "張無忌");}private void buttonClickName(int position, String name) {System.out.println("FragmentA.buttonClickName");activity.getServiceA2B().handleClickName(position, name);}private void buttonClickAvert() {System.out.println("FragmentA.buttonClickAvert");activity.getServiceA2B().handleClickAvert();}
}
第04節(jié) 開發(fā)者B
事件的接收方。FragmentB
// 總結(jié): 對于事件的接收者, FragmentB 需要做的三件事情:
// 1. 自己的 Fragment 當(dāng)中, 去定義接收到數(shù)據(jù)之后的實(shí)現(xiàn)展示的邏輯
// 2. 在外部定義需要銜接的接口, 代理接口 IServiceXXX
// 3. 在Activity 當(dāng)中, 去定義接口的內(nèi)部類實(shí)現(xiàn)。
// I. 接口實(shí)現(xiàn)的方法當(dāng)中, 采用 FragmentB 的對象, 去調(diào)用 FragmentB 當(dāng)中的方法
// II. 對外暴露出代理接口的對象, 也就是快捷鍵生產(chǎn) getIServiceXXX 的對象, 讓發(fā)送者持有代理接口對象。
public class FragmentB {private Activity activity;public void onCreateView(Activity activity){System.out.println("FragmentB.onCreateView");this.activity = activity;}public void showAvert() {System.out.println("FragmentB.showAvert");}public void showName(int position, String name) {System.out.println("FragmentB.showName.position: " + position +", name: " + name);}}
第05節(jié) 測試類
模擬過程
public class Main {public static void main(String[] args) {System.out.println("APP啟動了...");Activity activity = new Activity();activity.onCreate();System.out.println("APP退出了....");}
}
最終運(yùn)行的結(jié)果
APP啟動了...
FragmentA.onCreateView
FragmentA.buttonClickAvert
FragmentB.showAvert
FragmentA.buttonClickName
FragmentB.showName.position: 66, name: 張無忌
FragmentB.onCreateView
APP退出了....