日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

1.MVC,MVP,MVVVM

1.1什么是MVVM

1.MVVM,是Model-View-ViewModel的簡(jiǎn)寫,是M-V-VM三部分組成。它本質(zhì)上就是MVC 的改進(jìn) 版。MVVM 就是將其中的View 的狀態(tài)和行為抽象化,其中ViewModel將視圖 UI 和業(yè)務(wù)邏輯分 開,它可以取出 Model 的數(shù)據(jù)同時(shí)幫忙處理 View 中由于需要展示內(nèi)容而涉及的業(yè)務(wù)邏輯。

2.MVVM采用雙向數(shù)據(jù)綁定,view中數(shù)據(jù)變化將自動(dòng)反映到viewmodel上,反之,model中數(shù)據(jù)變化 也將會(huì)自動(dòng)展示在頁面上。把Model和View關(guān)聯(lián)起來的就是ViewModel。ViewModel負(fù)責(zé)把Model 的數(shù)據(jù)同步到View顯示出來,還負(fù)責(zé)把View的修改同步回Model。

3.MVVM核心思想,是關(guān)注model的變化,讓MVVM框架利用自己的機(jī)制自動(dòng)更新DOM,也就是所 謂的數(shù)據(jù)-視圖分離,數(shù)據(jù)不會(huì)影響視圖。

如圖(重點(diǎn)):

 

 1.2 Android MVVM

MVVM分為Model,View,ViewModel 三個(gè)部分

Model:數(shù)據(jù)層,包含數(shù)據(jù)實(shí)體和對(duì)數(shù)據(jù)實(shí)體的操作,和MVP的model沒有區(qū)別。

View: 界面層,對(duì)應(yīng)于Activity,XML,負(fù)責(zé)數(shù)據(jù)顯示以及用戶交互。相比MVP的view,這里面的 view視圖數(shù)據(jù)一般是在xml中使用DataBinding進(jìn)來雙向綁定數(shù)據(jù)的。    

ViewModel:關(guān)聯(lián)層,作為中間橋梁 去通知model數(shù)據(jù)層處理數(shù)據(jù)業(yè)務(wù),并將結(jié)果回調(diào)給 UI 層處 理 UI 邏輯。ViewModel中只有activity持有vm引用,vm是不持有view的引用的,所以vm的構(gòu)造方 法中不能傳入視圖相關(guān)的對(duì)象。所以重點(diǎn)在于怎么通知view,可以通過觀察者回調(diào)的方式。但是現(xiàn) 在一般是結(jié)合Jetpack來進(jìn)行view的更新的。

2.MVVM項(xiàng)目框架

如圖:

 3 MVVM核心構(gòu)成

3.1 DataBinding (重點(diǎn))(詳細(xì)講解)

數(shù)據(jù)和UI雙向綁定

3.2 LifeCycle

界面生命周期感知

3.3 ViewModel

業(yè)務(wù)邏輯

3.4 LiveData

可觀察數(shù)據(jù)項(xiàng)

3.5 MVVM項(xiàng)目框架搭建 通用性的快速開發(fā)框架 可應(yīng)用各項(xiàng)目中

4 DataBinding

4.1 DataBinding的簡(jiǎn)介

1.Data binding 在2015年7月發(fā)布的android Studio v1.3.0 版本上引入,在2016年4月Android Studio v2.0.0 上正式支持。目前為止,Data Binding 已經(jīng)支持雙向綁定了,實(shí)在2016年的google I/O大會(huì)上發(fā)布的。現(xiàn)在已經(jīng)很普及啦,在項(xiàng)目中也在慢慢使用。

 2.I/O大會(huì)上發(fā)布的。現(xiàn)在已經(jīng)很普及啦,在項(xiàng)目中也在慢慢使用。 Databinding 是一個(gè)實(shí)現(xiàn)數(shù)據(jù)和UI綁定的框架,是一個(gè)實(shí)現(xiàn) MVVM 模式的工具,有了 Data Binding,在Android中也可以很方便的實(shí)現(xiàn)MVVM開發(fā)模式。會(huì)JAVA web開發(fā)的會(huì)更好的理解在 xml中綁定數(shù)據(jù)的模式,在web開發(fā)中也是使用@{}來實(shí)現(xiàn)數(shù)據(jù)的顯示的。

3.Data Binding 是一個(gè)support庫(kù),最低支持到Android 2.1(API Level 7+)。使用 DataBing,Gradle的Android Plugin需要在1.5.0-alpha1以上。

4.Data Binding 之前我們不可避免地要編寫大量的毫無營(yíng)養(yǎng)的代碼,如 findViewById()、 setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通過 Data Binding , 我們可 以通過聲明式布局以精簡(jiǎn)的代碼來綁定應(yīng)用程序邏輯和布局,這樣就不用編寫大量的毫無營(yíng)養(yǎng)的代 碼了。

缺點(diǎn):

1. ViewModel與View一一對(duì)應(yīng);

2. 使用起來靈活性比較低;

3. Model屬性發(fā)生變化時(shí),ViewDatabinding采用異步更新數(shù)據(jù),對(duì)于現(xiàn)實(shí)大量數(shù)據(jù)的ListView,會(huì) 有一定延遲,在實(shí)踐測(cè)試中發(fā)現(xiàn),Databing效率較低,對(duì)于負(fù)責(zé)的界面不太適用;

4. 自動(dòng)生成大量代碼和屬性字段:ViewDataBinding 實(shí)現(xiàn)類 DataBinderMApper 等。

4.2使用DataBinding

具體步驟:

1.構(gòu)建環(huán)境(Build Environment)

在build.gradle中添加如下代碼:

 

Java
dataBinding {
        enabled = true
    }

2. 數(shù)據(jù)綁定布局文件

數(shù)據(jù)綁定的布局文件和我們以前經(jīng)常寫的布局文件稍有不同,并從布局的根標(biāo)記開始,后面依次是數(shù)據(jù) 元素和視圖根元素,即根布局是 layout,接下來是 data 節(jié)點(diǎn),variable 節(jié)點(diǎn),示例如下:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.hp.mvvmdemo.model.User" />
        <variable
            name="handler"
            type="com.hp.mvvmdemo.view.activity.MainActivity.Handler" />
    </data>

    <LinearLayout
        android:gravity="center"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/tv_show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />

        <TextView
            android:layout_marginTop="30dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:text="@{user.username}" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:text="@{user.password}" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{()->handler.onClick()}"/>

    </LinearLayout>


</layout>

3.在MainActivity.java中獲取bingding對(duì)象

Java
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
       

    }

4.4databinding點(diǎn)擊事件

xml:

 

 activity:

 5.單向綁定

5.1單個(gè)值的綁定:

1.集成DataDinding 添加 dataBinding.enabled true 和 dataBinding { enabled = true }

Java
android {
....
dataBinding {
enabled = true
}
}

2.實(shí)現(xiàn)xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable
        name="title"
        type="java.lang.String" />
</data>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:textColor="#000000"
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{title}"/>
</LinearLayout>
</layout>

5.2對(duì)象的綁定:

1.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable name="user" type="com.example.User"/>
</data>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.firstName}"/>
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.lastName}"/>
</LinearLayout>
</layout>

2.實(shí)體類:

Java
public class User {
    private final String firstName;
    private final String lastName;
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    public String getFirstName() {
        return this.firstName;
    }
    public String getLastName() {
        return this.lastName;
    }
}

3.databinding:

Java
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MainActivityBinding binding = DataBindingUtil.setContentView(this,
                R.layout.main_activity);
        User user = new User("Test", "User");
        binding.setUser(user);
    }

6.雙向綁定

雙向綁定是指其中任意一個(gè)變化后都會(huì)同步更新到另一個(gè)。雙向綁定使用@={}表達(dá)式來實(shí)現(xiàn) 4.5.1 目前已經(jīng)支持雙向綁定的列表

 7.從網(wǎng)頁獲取圖片

整體架構(gòu):

 

導(dǎo)入要使用的依賴:

build.gradle        

Java
implementation 'com.squareup.picasso:picasso:2.71828'
    //for rxjava
    implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
    //for rxandroid
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    //銜接 Retrofit & RxJava,此處一定要注意使用RxJava2的版本
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
    //添加Retrofit依賴
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    //添加Gson解析
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    //添加圖片加載庫(kù)依賴
    implementation 'com.github.bumptech.glide:glide:4.12.0'

xml層:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="imgurl"
            type="String" />
        <variable
            name="localurl"
            type="int" />
        <variable
            name="mainviewmodel"
            type="com.hp.day48stage01.viewmodel.MainViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".view.activity.MainActivity">

        <ImageView
            app.NETImage="@{imgurl}"
            app:localImage="@{localurl}"
            android:id="@+id/imageView"
            android:layout_width="300dp"
            android:layout_height="300dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@drawable/ic_launcher_background" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="64dp"
            android:text="點(diǎn)擊見美女"
            android:onClick="@{()->mainviewmodel.onChange()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@+id/imageView"
            app:layout_constraintHorizontal_bias="0.495"
            app:layout_constraintStart_toStartOf="@+id/imageView"
            app:layout_constraintTop_toBottomOf="@+id/imageView"
            app:layout_constraintVertical_bias="0.029" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

編寫實(shí)體類:

ModelGril.java

Java
public class ModelGirl {
    private boolean success;
    private String imgurl;
    private Info info;

    @Override
    public String toString() {
        return "MobileGirl{" +
                "success=" + success +
                ", imgurl='" + imgurl + ''' +
                ", info=" + info +
                '}';
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getImgurl() {
        return imgurl;
    }

    public void setImgurl(String imgurl) {
        this.imgurl = imgurl;
    }

    public Info getInfo() {
        return info;
    }

    public void setInfo(Info info) {
        this.info = info;
    }

    public static class Info{
        private int width;
        private int height;
        private String type;

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }
    }

}

編寫網(wǎng)絡(luò)接口:

Java
public interface GetImage_Interface {
    @GET("api/mobil.girl?type=json")
    Observable<ModelGirl> getPic();
}

適配器:

Java
public class ImageBindingAdapter {



    @BindingAdapter(value = {"netImage","localImage"},requireAll = false)
    public static void setImage(ImageView imageView,String url,int path){

        if (url != null && !"".equals(imageView)) {
            /*Glide.with(imageView.getContext())
                    .load(url)
                    .override(300,300)
                    .centerCrop()
                    .into(imageView);*/
            Picasso.get().load(url).placeholder(R.mipmap.jiazai).into(imageView);
        }else {
            imageView.setImageResource(path);
        }
    }

}
MainViewModel
Java
public class MainViewModel {
    private String imgurl;

    private ModelGirl modelGirl;

    private ActivityMainBinding binding;

    private final String TAG = "MainViewModel";

    public ModelGirl getModelGirl() {
        return modelGirl;
    }

    public void setModelGirl(ModelGirl modelGirl) {
        this.modelGirl = modelGirl;
    }

    public MainViewModel() {

    }

    public MainViewModel(ActivityMainBinding binding,String imgurl) {
        this.binding = binding;
        this.imgurl = imgurl;
        initGirl();
    }

    private void initGirl() {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.vvhan.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        GetImage_Interface request = retrofit.create(GetImage_Interface.class);

        Observable<ModelGirl> observable = request.getPic();

        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ModelGirl>() {
                    @Override
                    public void accept(ModelGirl modelGirl) throws Exception {
                        Log.i(TAG,"連接成功");
                        //Log.i(TAG, modelGirl.toString());
                        imgurl = modelGirl.getImgurl();
                        binding.setImgurl(imgurl);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.i(TAG,"連接失敗");
                    }
                });
    }
    public void onChange(){
        initGirl();
    }
}
MainActivity:
Java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);

        binding.setMainviewmodel(new MainViewModel(binding,""));

    }
}

 

分享到:
標(biāo)簽:Android
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定