Android實現MVVM架構數據刷新詳解流程
效果圖
示例結構圖
代碼解析
導入dataBinding
dataBinding{ enabled = true }
實體類
繼承BaseObservable
public class Sensor extends BaseObservable
為字段添加@Bindable
@Bindable public String getTmpValue() { return tmpValue; }
顯示圖片
圖片添加@BindingAdapter
@BindingAdapter( "tmpImage" )
示例采用本地圖片,沒有采用網絡圖片
@BindingAdapter( "tmpImage" ) public static void setTmpImage(ImageView view, int tmpImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( tmpImage ) ); }
為圖片路徑綁定字段
@Bindable public int getTmpImage() { return tmpImage; }
綁定實體類
<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="viewmodel" type="com.franzliszt.refreshdata.viewmodel.ViewModel" /> </data> <layout/>
根據設置@BindingAdapter( “tmpImage” )設置裡的內容,設置屬性
<ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" tmpImage="@{viewmodel.sensor.tmpImage}" android:scaleType="fitCenter"/>
實體類全部代碼
public class Sensor extends BaseObservable { private String tmpValue; private String humValue; private String lightValue; private String humanValue; private String smokeValue; private String fireValue; private int tmpImage; private int humImage; private int lightImage; private int humanImage; private int smokeImage; private int fireImage; public Sensor(){ } public Sensor(int tmpImage,int humImage,int lightImage,int humanImage,int smokeImage,int fireImage){ this.tmpImage = tmpImage; this.humImage = humImage; this.lightImage = lightImage; this.humanImage = humanImage; this.smokeImage = smokeImage; this.fireImage = fireImage; } @Bindable public String getTmpValue() { return tmpValue; } public void setTmpValue(String tmpValue) { this.tmpValue = tmpValue; notifyPropertyChanged( BR.tmpValue ); } @Bindable public String getHumValue() { return humValue; } public void setHumValue(String humValue) { this.humValue = humValue; notifyPropertyChanged( BR.humValue ); } @Bindable public String getLightValue() { return lightValue; } public void setLightValue(String lightValue) { this.lightValue = lightValue; notifyPropertyChanged( BR.lightValue ); } @Bindable public String getHumanValue() { return humanValue; } public void setHumanValue(String humanValue) { this.humanValue = humanValue; notifyPropertyChanged( BR.humanValue ); } @Bindable public String getSmokeValue() { return smokeValue; } public void setSmokeValue(String smokeValue) { this.smokeValue = smokeValue; notifyPropertyChanged( BR.smokeValue ); } @Bindable public String getFireValue() { return fireValue; } public void setFireValue(String fireValue) { this.fireValue = fireValue; notifyPropertyChanged( BR.fireValue ); } @Bindable public int getTmpImage() { return tmpImage; } @BindingAdapter( "tmpImage" ) public static void setTmpImage(ImageView view, int tmpImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( tmpImage ) ); } @Bindable public int getLightImage() { return lightImage; } @BindingAdapter( "lightImage" ) public static void setLightImage(ImageView view,int lightImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( lightImage ) ); } @Bindable public int getHumanImage() { return humanImage; } @BindingAdapter( "humanImage" ) public static void setHumanImage(ImageView view,int humanImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( humanImage ) ); } @Bindable public int getSmokeImage() { return smokeImage; } @BindingAdapter( "smokeImage" ) public static void setSmokeImage(ImageView view,int smokeImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( smokeImage ) ); } @Bindable public int getFireImage() { return fireImage; } @BindingAdapter( "fireImage" ) public static void setFireImage(ImageView view,int fireImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( fireImage ) ); } @Bindable public int getHumImage() { return humImage; } @BindingAdapter( "humImage" ) public static void setHumImage(ImageView view,int humImage) { view.setImageDrawable( view.getContext().getResources().getDrawable( humImage ) ); } }
xml視圖
<?xml version="1.0" encoding="utf-8"?> <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="viewmodel" type="com.franzliszt.refreshdata.viewmodel.ViewModel" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".view.MainActivity" android:layout_margin="30dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/item_bg_style" android:layout_marginTop="20dp" android:paddingTop="10dp"> <ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" tmpImage="@{viewmodel.sensor.tmpImage}" android:scaleType="fitCenter"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="溫度值:" android:textColor="#ffffff" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="@{viewmodel.sensor.tmpValue}" android:textColor="#ffffff" android:textSize="25sp" android:gravity="center"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/item_bg_style" android:layout_marginTop="20dp" android:paddingTop="10dp"> <ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" humImage="@{viewmodel.sensor.humImage}" android:scaleType="fitCenter"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="濕度值:" android:textColor="#ffffff" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="@{viewmodel.sensor.humValue}" android:textColor="#ffffff" android:textSize="25sp" android:gravity="center"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/item_bg_style" android:layout_marginTop="20dp" android:paddingTop="10dp"> <ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" lightImage="@{viewmodel.sensor.lightImage}" android:scaleType="fitCenter"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="光照值:" android:textColor="#ffffff" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="@{viewmodel.sensor.lightValue}" android:textColor="#ffffff" android:textSize="25sp" android:gravity="center"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/item_bg_style" android:layout_marginTop="20dp" android:paddingTop="10dp"> <ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" smokeImage="@{viewmodel.sensor.smokeImage}" android:scaleType="fitCenter"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="煙霧值:" android:textColor="#ffffff" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="@{viewmodel.sensor.smokeValue}" android:textColor="#ffffff" android:textSize="25sp" android:gravity="center"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/item_bg_style" android:layout_marginTop="20dp" android:paddingTop="10dp"> <ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" fireImage="@{viewmodel.sensor.fireImage}" android:scaleType="fitCenter"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="火焰值:" android:textColor="#ffffff" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="@{viewmodel.sensor.fireValue}" android:textColor="#ffffff" android:textSize="25sp" android:gravity="center"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/item_bg_style" android:layout_marginTop="20dp" android:paddingTop="10dp"> <ImageView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" humanImage="@{viewmodel.sensor.humanImage}" android:scaleType="fitCenter"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="人體紅外:" android:textColor="#ffffff" android:textSize="20sp" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="50dp" android:text="@{viewmodel.sensor.humanValue}" android:textColor="#ffffff" android:textSize="25sp" android:gravity="center"/> </LinearLayout> </LinearLayout> </layout>
VM
接收數據
調用Handle類的接口,接收傳感器數據(隨機數據)
private void InitData(){ handle.setHandleDta( new Handle.HandleData() { @Override public void getSensorValue(int[] value) { new Thread( ()->{ while (true){ try { Thread.sleep( 5000 ); } catch (InterruptedException e) { e.printStackTrace(); } sensor.setTmpValue( value[0]+"℃"); sensor.setHumValue( value[1]+"RH" ); sensor.setLightValue( value[2]+"LUX" ); sensor.setSmokeValue( value[3]+"%" ); sensor.setFireValue( value[4]+"%" ); sensor.setHumanValue( value[5] == 1 ? "有人" : "無人" ); } } ).start(); } }); }
發送數據
建立接口,回調數據
public interface HandleData{ void getSensorValue(int[] value); } public void setHandleDta(HandleData handleDta){ int[] value = ReturnData(); handleDta.getSensorValue(value); }
制造數據
private void RefreshSensorValue(){ thread = new Thread( ()->{ while (true){ try { Thread.sleep( 2000 ); } catch (InterruptedException e) { e.printStackTrace(); } /*溫度*/ value[0] = RandomRange(35,30); /*濕度*/ value[1] = RandomRange(80,75); /*光照值*/ value[2] = RandomRange(120,100); /*煙霧*/ value[3] = RandomRange(60,50); /*火焰*/ value[4] = RandomRange(30,25); /*紅外*/ value[5] = RandomRange(2,0); Log.d( "TAG",value[5]+"" ); } } ); thread.start(); }
綁定視圖與數據層
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); binding = DataBindingUtil.setContentView( this,R.layout.activity_main ); binding.setViewmodel( new ViewModel() ); } }
到此這篇關於Android實現MVVM架構數據刷新詳解流程的文章就介紹到這瞭,更多相關Android 數據刷新內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!