淺析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裡面的值我們可以知道,這兩個註解一個是作用於屬性,一個是作用於方法的。這裡提醒一下,第二步:設定註解
@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
解決 Springboot中Interceptor攔截器中依賴注入失敗
BeanFactory beanFactory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()); userService = (UserService) bea
關於spring中依賴注入(AOP)的理解
Spring中的依賴注入可以分為介面注入、構造器注入、set方法注入 介面注入的話都是實現一個介面然後實現對應的方法。(比較常用) 如果使用構造器注入可以在建立物件的同時完成依賴關係的建立。如果使用set方法注入的話更容易識別它的名稱。但是如果使用構造器注入的方式
android中WebView注入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
解決Springboot中Interceptor攔截器中依賴注入失敗
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
淺析Android中Parcel類
在淺析繫結遠端服務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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!