Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據綁定,MVVM框架

Android數據綁定,MVVM框架

編輯:關於Android編程

最近研究怎麼讓自己的程序節省幾行代碼。仔細想一想,我們在做客戶端類的APP時,最基礎,大量重復的場景就是:

1.從服務器請求數據2.解析得到的數據並處理加以封裝3.將封裝好的數據送到UI線程顯示到View上。

那麼,不可避免的。一次流程我們需要編寫:http數據請求,JSON解析處理,異步處理,Handler,業務異常處理,View顯示,如果有集合控件,還得寫ViewHolder,Adapter。十幾個類,N個方法,數百行不止的代碼。枯燥無味,費時費力。

那麼怎麼辦,現在流行rxjava,retrofit等框架,自然是非常方便優雅。但是作為程序猿自然得有自己的想法,於是乎有了下面這個即將介紹給大家的“小玩具”。

首先,思考一下上面所說的一套標准流程,真正不可或缺的只有什麼?那就是協議,換句話說就是接口,從數據的角度來說:一是從服務器返回的值的協議(json等數據格式到Model模型的映射),二是你請求服務器的參數協議url,參數,頭信息等;除此之外,你需要一個數據到視圖的映射關系,以及控制層的接口。從java代碼的角度來說,你需要1.接口一個,2.帶映射關系的(View到值映射,json到對象映射)Model數據模型類,3.沒了。

下面就模擬一下下面所說的場景。我將用我寫的小玩具完成一次登陸/注冊模擬,帶參請求服務器登陸,並返回一段JSON數據,包含jsonobject和jsonarray,並顯示到textView和listview上。

1.接口,你需要寫一個服務接口,裡面有你的業務方法,你只需要在接口的抽象方法上的注解上配置一下,接口實現就交給框架動態代理。  
public interface ILogin {

    @HttpSrcMethod(url = "http://www.baidu.com")
    public UserInfoModel login(@Param("name") String name, @Param("pass") String pass, @Header("par3") String par3);

    @HttpSrcMethod(url = "http://www.baidu.com",connMode = HttpConnectMode.Post,runMode = HttpRunMode.Async,filters = TestFilter.class)
    public UserInfoModel regist(@Param("name") String name, @Param("pass") String pass, @Header("par3") String par3);

}

@HttpSrcMethod表示這個方法將被代理為Http請求業務,注解可以指定url,參數,頭的參數映射,可以配置同步還是異步請求,親求方式Post/Get等,還有過濾器,過濾器將在框架解析返回的string之前對返回的字符串進行一些自定義操作,如解密等。

 

2.完成帶映射的數據模型,注解映射JSON/Xml數據元素到Model的關系,注解映射ViewId到Model的關系

 

@JsonOrm
public class UserInfoModel implements IHandler{

    @BindTextView(R.id.text1)
    @JsonString
    private String name;
    @BindTextView(R.id.text3)
    @JsonString
    private String pass;
    @BindRecycleView(R.id.list)
    @BindObj
    @JsonSet(clazz = ItemModel.class)
    private List obj;

    @Override
    public void handler() {
        name = name+"handled";
    }
}
@ListDataSrc(R.layout.item) public class ItemModel { @BindText(R.id.item_text) @JsonString private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }

 

如果Model實現了IHandler接口,那麼框架將會在json/xml解析完成之後,調用handle方法,增加對model的控制力,完成一些較為復雜的數據處理邏輯,這也是這一模式的缺點,控制力低,只適合較為簡單的流程邏輯。

 

這樣僅僅通過這一個數據模型類,框架就知道了JSON元素和View之間的關系了。

3.控制層的調用。只需要申明一下你的業務接口,讓框架生成代理對象,直接調用即可。

 

public class MainActivity extends AppCompatActivity implements ICallBack{

    public final static String json = "{\n" +
            "    \"name\": \"gy\",\n" +
            "    \"pass\": \"123\",\n" +
            "    \"obj\": [\n" +
            "        {\n" +
            "            \"name\": \"gy\"\n" +
            "        },\n" +
            "        {\n" +
            "            \"name\": \"gy\"\n" +
            "        },\n" +
            "        {\n" +
            "            \"name\": \"gy\"\n" +
            "        },\n" +
            "        {\n" +
            "            \"name\": \"gy\"\n" +
            "        }\n" +
            "    ]\n" +
            "}";

    private ILogin login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        login = HttpProxyFactory.With(ILogin.class)
                                .addViewContent("login",this)
                                .addCallBack("login",this)
                                .establish();
        login.login("gy","123","xxxx");
    }

    @Override
    public void onSuccess(Object o) {
        
    }

    @Override
    public void onFailed(Object o) {

    }
}

 

同時,你可以設置接口中某個業務的回調,以及視圖映射所需要的父容器,一般是Activity或者父視圖。

4.最後,由於框架在解析Model和接口的時候使用的巨量的反射操作,幾乎占用了主線程50-100ms的時間。為了優化性能,異步的預加載是必須的,我們在Application中,預先解析好接口和Model的數據結構存在緩存中。大大優化了性能,其實反射的主要耗時在與方法,接口等類型元素的查找獲取,而invoke其實對性能的影響可以忽略不計。
public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        S.init(this);
        MvvmCacheControl.preLoad(new Class[]{ILogin.class});
    }
}
附上結果 \   好了,忙裡偷閒水了一篇,以上只是對這個小玩意的使用介紹,這個還屬於demo級,有很多功能還沒有實現,代碼也不夠健壯。具體的實現分析就放在下一篇好了,敬請期待。下面附上源碼地址,整合在我的小框架裡了,Android Studio直接導入工程即可GitHub。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved