1. 程式人生 > >淺析android中的依賴注入

淺析android中的依賴注入

     這幾年針對Android推出了不少View注入框架,例如ButterKnife。我們首先來了解一下使用這些框架有什麼好處,其實好處很明顯:它可以減少大量的findViewById以及setOnClickListener程式碼,簡化了程式碼,讓我們的程式碼看起來條理更清晰,可讀性變強。

     可能大多數對於這一類框架,都只是停留在用的階段,但是作為一個程式設計師,我們有必要去了解它是如何實現的。其實它的原理也沒有多複雜,用到了java中反射和註解的相關知識,所以對反射和註解瞭解不多的朋友可以先找一下相關資料瞭解一下。

今天的任務呢就是教大家如何一步一步簡單的實現一個類似 ButterKnife的依賴注入的效果:

第一步:我們需要自定義註解,如下:

//用於初始化view的

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
    int value() default 0;
}
//用於繫結點選事件的
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindClick {
    int value() default 0;
}
從上面的Target裡面的值我們可以知道,這兩個註解一個是作用於屬性,一個是作用於方法的。這裡提醒一下
如果如果只有一個引數成員,最好把引數名稱設為value,這裡可以補一句因為使用該註解時,value作為key可省略,在使用的時候比較方便。

第二步:設定註解

    @BindView(R.id.button)
    private Button mButton;
    @BindView(R.id.textview)
    private TextView mTextView;

    @BindClick(R.id.button)
    private void onButtonClick(){
        Toast.makeText(this,"Button被點選了",Toast.LENGTH_SHORT).show();
    }
    @BindClick(R.id.textview)
    private void onTextViewClick(){
        Toast.makeText(this,"TextView被點選了",Toast.LENGTH_SHORT).show();
    }
第三步:獲取註解,進行處理
public class InjectUtils {
    public static void inject(final Activity activity) {
        //遍歷屬性,對設定註解的view進行初始化
        Class<Activity> activityClass= (Class<Activity>) activity.getClass();
        Field fields[]=activityClass.getDeclaredFields();
        for(Field field:fields){
            if(field.isAnnotationPresent(BindView.class)){
                int viewId=field.getAnnotation(BindView.class).value();
                View view=activity.findViewById(viewId);
                try {
                    //這一行程式碼是必須的,否則直接呼叫set方法不生效
                    field.setAccessible(true);
                    field.set(activity,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        //遍歷方法 將設定註解的方法繫結到相應的view的點選事件中
        Method methods[]=activityClass.getDeclaredMethods();
        for(final Method method:methods){
            BindClick bindClick=method.getAnnotation(BindClick.class);
            if(bindClick!=null){
                int viewId=bindClick.value();
                activity.findViewById(viewId).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        try {
                            //呼叫該方法
                            method.setAccessible(true);
                            method.invoke(activity);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    }
}

第四步:其實上面已經完成了處理,我們只需要呼叫一下就可以了,像下面那樣:
        setContentView(R.layout.activity_main);
        //必須放在setContentView後面
        InjectUtils.inject(this);
下面,我們就可以執行一下專案,看看是不是達到我們的效果了。

相關推薦

淺析android依賴注入

     這幾年針對Android推出了不少View注入框架,例如ButterKnife。我們首先來了解一下使用這些框架有什麼好處,其實好處很明顯:它可以減少大量的findViewById以及setOnClickListener程式碼,簡化了程式碼,讓我們的程式碼看起來條理

在Spring依賴注入的幾種方式實現鬆耦合

一、普通注入方式: (1)在IDEA工作空間內先建立lib包然後匯入Spring的架包(複製進去的架包要按住滑鼠右鍵出現Add as Library)。 (2)在已經建立好架包的基礎上在src目錄下建立XML檔案,檔案命為applicationContext.xml,需要注意的是我們建

spring依賴注入方式總結

文章來源於今日頭條使用者:分散式系統架構 一、註解注入 註解注入在Spring中是用的最多的一種方式,就是在java程式碼中使用註解的方式進行裝配,在程式碼中加入@Resource或者@Autowired、 1、Autowired是自動注入,自動從spring的上下文找到合適的bean來

關於php依賴注入(DI)和控制反轉(IOC)的理解

一、什麼是依賴注入和控制反轉 1.依賴注入(DI)— Dependecy Injection 為了更方便的理解,我們把依賴注入分開理解,首先什麼是依賴?顧名思義,依賴就是各元件之間的一種關係。一般來說,在面向物件程式設計中,我們在類A中 使用到了 類B的例項,我們就可以說

Angular依賴注入

依賴注入: DI,Dependency injection 控制反轉: IOC,Inversion of Control 好處:鬆耦合 注入器: constructor(private productService:ProductService){} 提供器: providers:[Prpd

解決 SpringbootInterceptor攔截器依賴注入失敗

BeanFactory beanFactory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()); userService = (UserService) bea

關於spring依賴注入(AOP)的理解

Spring中的依賴注入可以分為介面注入、構造器注入、set方法注入    介面注入的話都是實現一個介面然後實現對應的方法。(比較常用)    如果使用構造器注入可以在建立物件的同時完成依賴關係的建立。如果使用set方法注入的話更容易識別它的名稱。但是如果使用構造器注入的方式

androidWebView注入Js的問題記錄

在使用WebView載入https連結,會有證書驗證問題,通過複寫WebViewClient中的方法可以解決,程式碼如下: mWebView.setWebViewClient(new WebViewClient() { @Override publi

Android ButterKnife依賴注入框架簡單使用

Butter Knife 通過註解的方式,將Android View與成員變數和方法繫結起來,為你形成一種模板樣式的程式碼。 在成員變數上使用@BindView替換掉 findView

Android快速依賴注入框架Dagger2使用1

一、啥是Dagger2 Dagger2的內容有點多,一點得有耐心。 1.1 簡介 Dagger2是一個Android/Java平臺上快速依賴注入框架,由谷歌開發,最早的版本Dagger1 由Square公司開發。依賴注入框架主要用於模組間解耦,提高程式

spring依賴注入的方式及實現(2)

依賴注入的方式1、屬性注入2、構造器注入3、工廠方法注入(很少使用,不推薦)1、屬性注入(1)屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的物件(2)屬性注入使用 <proper

解決SpringbootInterceptor攔截器依賴注入失敗

I want to add spring mvc interceptor as part of Java config. I already have a xml based config for this but I am trying to move to a Java

淺析AndroidParcel類

在淺析繫結遠端服務bindService基本原理與AIDL分析中,我們在使用服務呼叫遠端服務的函式時,到底可以傳遞哪些型別的引數類,在AIDL程序間傳遞複雜資料型別中,我們詳細解析了它可以傳遞的資料型別,那麼到底為什麼它只能傳遞這些資料型別。 其實我們在呼叫遠

.Net Core依賴注入服務使用總結

一、依賴注入   引入依賴注入的目的是為了解耦和。說白了就是面向介面程式設計,通過呼叫介面的方法,而不直接例項化物件去呼叫。這樣做的好處就是如果添加了另一個種實現類,不需要修改之前程式碼,只需要修改注入的地方將實現類替換。上面的說的通過介面呼叫方法,實際上還是需要去例項化介面的實現類,只不過不需要我們手動n

.NET 依賴注入元件 Autofac 的效能漫聊

Autofac 是一款超讚的 .NET IoC 容器 ,在眾多效能測評中,它也是表現最優秀的一個。 它管理類之間的依賴關係, 從而使 應用在規模及複雜性增長的情況下依然可以輕易地修改。它的實現方式是將常規的.net類當做 元件 處理。 簡單的效能測試 在 LINQPad 中,我們

大話DI依賴注入+IOC控制反轉(二) 之 淺析.Net Core的DI與IOC

      在上一篇文章中,我們聊了很多關於定義的方面,比較孤燥,下面我們結合.Net Core聊一下依賴注入&控制反轉。   三種物件生命週期       關於.Net Core中的容

秒懂依賴注入及 Dagger2 的實用技能(如何在Android使用)

前言 古人曰:紙上得來終覺淺,絕知此事要躬行,這話說的是真他孃的有道理啊,對於程式設計那點事似乎更是真理。2016年的時候就首次瞭解過dagger,但是沒有去編碼實現,當時哥們真覺得懂了,但是最近有個專案要使用Dagger2,突然發現還是不知道如

Asp.net MVC如何實現依賴注入(DI)(二)

昨天說了一下Castle與Autofac如何在MVC中的使用,今天再來簡單說一下Spring.Net框架在MVC中如何依賴注入的。 官網:http://www.springframework.net/ 專案結構圖:   首先,我們要在專案中新增Spring.Net的類庫引用,我們可以在N

ASP.NET Core使用GraphQL - 第三章 依賴注入

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 SOLID原則中的D表示依賴倒置原則。這個原則的內容是: 上層模組不應

淺析Android Camera開發的三個尺寸和三種變形 貢獻一個自適配Picturesize和Previewsiz

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!