设为首页 加入收藏

TOP

Android开发利器之Data Binding Compiler V2 —— 搭建Android MVVM完全体的基础(四)
2019-09-01 23:26:38 】 浏览:113
Tags:Android 开发 利器 Data Binding Compiler 搭建 MVVM 全体 基础
id:text="@{viewModel.loginPrompt}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/til_password" /> </android.support.constraint.ConstraintLayout> </layout>

ViewModel

public class LoginViewModel extends ViewModel {  
  
    private static final String TAG = "LoginViewModel";  
  
    private final MutableLiveData<Boolean> isLoading = new MutableLiveData<>();  
    private final MutableLiveData<Account> account = new MutableLiveData<>();  
    private final MutableLiveData<String> loginPrompt = new MutableLiveData<>();  
  
    public LoginViewModel(){  
        account.postValue(new Account("",""));  
        isLoading.postValue(false);  
    }  
  
    public void login(View view){  
        String loginMsg =  "accountNum = " + Objects.requireNonNull(account.getValue()).getAccountNum().getValue()  
                + "\npassword = " + Objects.requireNonNull(account.getValue()).getPassword().getValue();  
        Log.d(TAG,"\n正在登陆中....\n"  
               + loginMsg);  
        loginPrompt.postValue("正在登陆账号:" + Objects.requireNonNull(account.getValue()).getAccountNum().getValue());  
        isLoading.postValue(true);  
            new Handler().postDelayed(() -> {  
                Log.d(TAG,"登陆成功....\n");  
                isLoading.postValue(false);  
                Intent intent = new Intent(view.getContext(), MainActivity.class);  
                intent.putExtra("hello", loginMsg);  
                view.getContext().startActivity(intent);  
                loginPrompt.postValue("");  
            }, 2000);  
  
    }  
  
    public MutableLiveData<Boolean> getIsLoading(){  
        return isLoading;  
    }  
  
    public Account getAccount(){  
        return account.getValue();  
    }  
  
    public MutableLiveData<String> getLoginPrompt() {  
        return loginPrompt;  
    }  
}  

Activity

public class MainActivity extends AppCompatActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);  
        binding.setHello(getIntent().getStringExtra("hello") + "\n hello word !");  
        binding.setLifecycleOwner(this);  
  
    }  
}  

到这里,我们就能愉快地Data Binding Compiler V2了。
从测试代码可以看出,代码和我们使用Data Binding Compiler V1的时候差不多,有区别的地方只有两点:

  1. ObservableField替换成LiveData
  2. binding对象需要调用setLifecycleOwner(LifecycleOwner lifecycleOwner
    )设置lifecycleOwner对象。

示例代码

笔者在GitHub上面建立了一个项目,以后所有的文章的测试DEMO都会上传到这个项目上,有兴趣的读者可以关注下。
这篇文章的示例在项目中的todoDatabinding文件下。

项目结构如图所示:

其中databindingcompilerv1为Data Binding Compiler V1下的示例代码
其中databindingcompilerv2为Data Binding Compiler V2下的示例代码

Data Binding Compiler V2 示例代码

小结

Data Binding Compiler V2主要是解决了Data Binding不能感知View层生命周期的问题。
在Android开发中我们的控制层(这里指ViewModel)的生命周期和View层组件的生命周期是不能保持一致的,大多数情况下,控制层的生命周期会比View层长。例如,我们发起网络请求的时候,在请求回调之前View有被销毁的可能,如果在View被销毁后控制层再更新View层,这个时候我们就会遇到讨厌的NPE异常。Lifecycle系列组件的主要功能就是使控制层能够感知View层的生命周期。而Data Binding Compiler V2则是为了使Data Binding能够使用Lifecycle中的LiveData从而获得感知生命周期的能力,即达成Data Binding 的lifecycle-aware。

关于我

GitHub

微信公众号:
如果你觉得这片文章对你有所启发的话,可以关注我的微信公众号哦

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇as无法关联git 下一篇继续封装个 Volley 组件

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目