來,咱們自己寫一個Android的IOC架構!,androidioc架構

來源:互聯網
上載者:User

來,咱們自己寫一個Android的IOC架構!,androidioc架構

到目前位置,afinal開發架構也是用了好幾個月了,還記得第一次使用注釋完成控制項的初始化和事件綁定的時候,當時的心情是多麼的興奮— —代碼竟然可以這樣寫!然後隨著不斷的學習,也慢慢的對IOC架構和註解反射等東西有了一點簡單的瞭解,之前的一篇文章簡單的介紹了一下Java的反射機制,今天的文章,就完成一個簡單的,基於IOC的小Demo,讓大家慢慢的對IOC有一點簡單的瞭解。

首先,什麼是IOC呢?

控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的物件導向編程的法則來削減電腦程式的耦合問題,也是輕量級的Spring架構的核心。 控制反轉一般分為兩種類型,依賴注入(Dependency Injection,簡稱DI)和依賴尋找。依賴注入應用比較廣泛。

我們下面要完成的,就是Android中依賴注入的實現。

首先,看我們的項目結構


結構很簡單,一個基類,一個子類,一個自訂注釋類型,一個布局檔案。

下面看代碼的具體實現

首先看最重要的基類

BaseActivity.java

package com.example.iocdemo;import java.lang.reflect.Field;import android.app.Activity;import android.content.Context;import android.view.View;import android.view.View.OnClickListener;import android.widget.Toast;public class BaseActivity extends Activity {protected Context mContext = this;/** * 實現IOC注入 *  * @param baseActivity */public void initInjectedView(Object baseActivity) {// 擷取所有的成員變數Field[] fields = baseActivity.getClass().getDeclaredFields();if (fields != null && fields.length > 0) {// 遍曆成員變數for (Field field : fields) {try {// 抑制許可權檢查field.setAccessible(true);// 擷取成員變數的注釋類ViewInject viewInject = field.getAnnotation(ViewInject.class);// 如果注釋類不為空白,即成員變數是使用注釋的方式進行聲明的if (viewInject != null) {// 擷取注釋中的idint id = viewInject.id();// 設定欄位值field.set(this,((Activity) baseActivity).findViewById(id));// 將執行個體化好的View對象取出View view = (View) field.get(this);// 綁定監聽事件view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "別點人家吖!",Toast.LENGTH_SHORT).show();}});}} catch (Exception e) {e.printStackTrace();}}}}}

在這個類裡面,我們完成了IOC注入方法的編寫,自訂的注釋類型代碼如下:

package com.example.iocdemo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ViewInject {public int id();}
@Target(ElementType.FIELD)這句代碼實現的是控制注釋的位置為欄位,或者說是成員變數,因為我們要完成的是控制項的注釋,和時間綁定,因此,我們設定為ElementType.FIELD就可以。

@Retention是一個enum類型,共有三個值,分別是SOURCE,CLASS 和 RUNTIME.。

SOURCE代表的是這個Annotation類型的資訊只會保留在程式源碼裡,源碼如果經過了編譯之後,Annotation的資料就會消失,並不會保留在編譯好的.class檔案裡面。

ClASS的意思是這個Annotation類型的資訊保留在程式源碼裡,同時也會保留在編譯好的.class檔案裡面,在執行的時候,並不會把這一些資訊載入到虛擬機器(JVM)中去.注意一下,當你沒有設定一個Annotation類型的Retention值時,系統預設值是CLASS. 
RUNTIME,表示在源碼、編譯好的.class檔案中保留資訊,在執行的時候會把這一些資訊載入到JVM中去的。

因為我們需要在JVM把我們的class檔案載入進入之後,完成注入,因此,我們選擇這個屬性。

好了,現在我們知道如何簡單的定義一個自訂的注釋類型,並且用代碼實現了代碼注入和事件綁定,下面,我們看一下在我們的程式中,如何使用。

下面是我們在Activity的代碼

package com.example.iocdemo;import android.os.Bundle;import android.widget.Button;public class MainActivity extends BaseActivity {//用注釋進行控制項的初始化@ViewInject(id = R.id.btn)Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//進行注入initInjectedView(this);}}

下面是我們的運行結果



需要設計一個類似IOC容器類

很典型的簡單工廠啊。
public class Helper<T>
where T : class,new()
{
public T GetInstance(T obj)
{
if (obj != null)
{
return obj;
}
else
{
obj = Activator.CreateInstance(typeof(T)) as T;
return obj;
}

}
}
測試:
System.ArgumentException ar = null;
Helper<System.ArgumentException> helper = new Helper<System.ArgumentException>();
object iar = helper.GetInstance(ar);
 
怎寫一套自己的javascript架構

可以先從簡單的封裝做起,比如將一些常用的方法進行封裝其他人只需調用即可不管你內部如何?。至於效果我一般都是些jq的外掛程式,方便快捷。
提供下我寫的,比較簡單,就當練手積累經驗吧。
(function(){
if(!window.Mr_2_B){
window.Mr_2_B = {};

}

function trim(txt){
return txt.replace(/(^\s*)|(\s*$)/g, "");
}
window.Mr_2_B.trim = trim;
})();

//頁面調用(別忘了引入)

Mr_2_B.trim(" hi");
Mr_2_B自己定義,實現方法很多種,給樓主做個參考.
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.