目录
一、现状
传统写法(未使用JetPack)
- 功能越大,下面缺点越大
- Activity和Fragment是大管家
- Activity要处理逻辑
- Activity要处理Model数据
- Activity 要实时刷新ui,例如更新Textview
- Activity 横竖排切换会丢失数据
JetPack
- Androidx==JetPack
- Activity 就是管控者-单一原则
- JetPack更新比Android 更快 ----> 自己独立出来,所以更新很快
开始改造,采用jetpack,性能提升40-50%。分工明确,层次清晰
分层
- 第一层 管控层Activity
- 第二层 UI数据Model层
- 第三层 UI View布局层
- 关联:管控层管理起来
eg:网易云
能力关键差别:懂原理,会手写
二、具体实战
android {
defaultConfig {
dataBinding {
enabled true
}
}
}
把Activity的数据Model给抽取出来
LiveData 对数据的感应(数据发送改变,观察者设计模式,让我的观察者 改变==UI改变)
MutableLiveData
AndroidViewModel 如果要用context环境,用它
public class LoginViewModel extends AndroidViewModel {
//LiveData 对数据的感应(数据发送改变,观察者设计模式,让我的观察者 改变==UI改变)
private MutableLiveData<String> phoneInfo;
private Context context;
//如果不需要 环境Context,就直接继承ViewModel
//如果需要 环境Context,就继承AndroidViewModel
public LoginJetViewModel(@NonNull Application application) {
super(application);
this.context = application.getApplicationContext();
}
//暴露出去数据
public MutableLiveData<String> getPhoneInfo() {
if (phoneInfo == null) {//提高性能
phoneInfo = new MutableLiveData<>();
phoneInfo.setValue("");//初始化数据
}
return phoneInfo;
}
public void login() {
ToastUtils.showShortToast(context, "点击了登录按钮");
phoneInfo.setValue("点击了登录按钮");
}
activity_login.xml
小提示:Alt+Enter 自动加入databinding
<?xml version="1.0" encoding="utf-8"?>
<!-- 凡是让databinding 来管理的 都需要加入 layout-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<!-- 数据管理区域-->
<data>
<variable
name="data"
type="com.cdz.cdm.login.LoginViewModel" /> <!-- 指定哪一个viewmodel-->
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/iv_login_bg"
tools:ignore="MissingConstraints">
<TextView
android:id="@+id/tv_login_title_prompt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:padding="12dp"
android:src="@mipmap/iv_back_white"
android:text="@{data.phoneInfo}"
android:textColor="@color/white"
android:textSize="22sp"
app:layout_constraintLeft_toLeftOf="parent"
/>
<TextView
android:id="@+id/tv_login"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_margin="20dp"
android:layout_marginTop="@dimen/dp_40"
android:background="@drawable/login_tv_flese"
android:gravity="center"
android:onClick="@{()->data.login()}"
android:text="登录"
android:textColor="@color/white"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/tv_login_title_prompt" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
DataBinding类是根据xml布局文件的名字生成的,activity_main.xml->ActivityMainBinding
/**
* 登录界面
*/
public class LoginActivity extends AppCompatActivity {
//DataBinding类是根据xml布局文件的名字生成的,activity_login.xml->ActivityLoginBinding
private ActivityMainBinding binding;
private LoginViewModel viewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.aaaaa);
viewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(LoginJetViewModel.class);
binding.setData(viewModel);
binding.setLifecycleOwner(this);
}
}