建站程序,湖北省城建设计院网站,站长工具seo综合查询问题,个人网站首页1.LiveData初识
LiveData:ViewModel管理要展示的数据#xff08;VM层类似于原MVP中的P层#xff09;#xff0c;处理业务逻辑#xff0c;比如调用服务器的登陆接口业务。通过LiveData观察者模式#xff0c;只要数据的值发生了改变#xff0c;就会自动通知VIEW层#xf…1.LiveData初识
LiveData:ViewModel管理要展示的数据VM层类似于原MVP中的P层处理业务逻辑比如调用服务器的登陆接口业务。通过LiveData观察者模式只要数据的值发生了改变就会自动通知VIEW层View层会设置观察者来监听数据的改变。
MVP:P调用M层去获取数据P回调View层实现的接口把数据以函数参数的形式传递过去。
2.示例工程 build.gradle要修改下增加如下配置以开启Databinding dataBinding{enabled true;} 2.1View层 布局界面AltEnter可以转成Databinding可以识别的布局。这时识别前的布局。 activity_main.xml。
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityandroid:gravitycenter_horizontalandroid:orientationverticalEditTextandroid:layout_marginTop100dpandroid:idid/edtUserNameandroid:layout_width200dpandroid:layout_heightwrap_contentandroid:hint请输入用户名! /EditTextandroid:idid/edtPasswordandroid:layout_width200dpandroid:layout_heightwrap_contentandroid:hint请输入密码! /Buttonandroid:idid/btLoginandroid:layout_width200dpandroid:layout_heightwrap_contentandroid:text登陆//LinearLayout 转换后的布局
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsdata/dataLinearLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityandroid:gravitycenter_horizontalandroid:orientationverticalEditTextandroid:layout_marginTop100dpandroid:idid/edtUserNameandroid:layout_width200dpandroid:layout_heightwrap_contentandroid:hint请输入用户名! /EditTextandroid:idid/edtPasswordandroid:layout_width200dpandroid:layout_heightwrap_contentandroid:hint请输入密码! /Buttonandroid:idid/btLoginandroid:layout_width200dpandroid:layout_heightwrap_contentandroid:text登陆 //LinearLayout
/layout MainActivity.java
package com.gaoting.livedatatest.ui;import android.os.Bundle;
import android.view.View;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;import com.gaoting.livedatatest.R;
import com.gaoting.livedatatest.databinding.ActivityMainBinding;
import com.gaoting.livedatatest.viewmodel.LoginViewModel;/**** View层*/
public class MainActivity extends AppCompatActivity {ActivityMainBinding activityMainBinding;LoginViewModel loginViewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);activityMainBinding DataBindingUtil.setContentView(this,R.layout.activity_main);loginViewModel new ViewModelProvider(MainActivity.this).get(LoginViewModel.class);initView();initListener();initLiveDataObserver();}private void initLiveDataObserver() {loginViewModel.getStrToken().observe(this, new ObserverString() {Overridepublic void onChanged(String newToken) {Toast.makeText(MainActivity.this,TOKENnewToken,Toast.LENGTH_SHORT).show();}});}private void initListener() {activityMainBinding.btLogin.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {String username activityMainBinding.edtUserName.getText().toString();String password activityMainBinding.edtPassword.getText().toString();loginViewModel.login(username,password);}});}private void initView() {activityMainBinding.edtUserName.setText(test);activityMainBinding.edtPassword.setText(12345678);}
}
2.2ViewModel层
package com.gaoting.livedatatest.viewmodel;import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;import com.gaoting.livedatatest.model.HttpDataSource;/**** VM层* 1.viewModel用来管理view层Activity要展示的数据* 2.处理业务逻辑比如对数据进行加工处理获取HTTP接口数据。*/
public class LoginViewModel extends ViewModel {//livedata token stringMutableLiveDataString strToken new MutableLiveData();public MutableLiveDataString getStrToken() {return strToken;}//loginpublic void login(String username, String password) {//可能会对密码进行加密等业务逻辑这里我们忽略。HttpDataSource httpDataSource new HttpDataSource();String token httpDataSource.login(username,password);strToken.postValue(token);}
}2.3Model层
package com.gaoting.livedatatest.model;/**** 获取网络数据M层*/
public class HttpDataSource {//模拟请求网络服务器的登陆业务接口public String login(String username, String password) {String token;try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}token 123token;return token;}
}