wordpress多用戶后臺windows10優(yōu)化大師
1.ViewModel
解決問題:
- 瞬態(tài)數據丟失
- 異步調用內存泄漏
- 類膨脹提高維護難度和測試難度
作用:
- 介于View視圖和Model數據模型之間橋梁
- 使視圖和數據能夠分離,也能保持通信
public class MainActivity extends AppCompatActivity {private TextView textView;private MyViewModel viewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.number));}public void plusNumber(View view) {textView.setText(String.valueOf(++viewModel.number));}
}
public class MyViewModel extends ViewModel {public int number;}
2.LiveData
LiveData是Android架構組件中的一部分,用于在數據源和UI之間建立連接,實現數據的實時更新和同步。它允許觀察者(例如Activity或Fragment)訂閱數據變化,并在數據發(fā)生變化時自動更新UI。
- 基本概念:LiveData是一個可觀察的數據持有者類,它遵循觀察者模式。這意味著它可以持有數據,并且當數據發(fā)生變化時,它會通知所有已訂閱的觀察者。這在處理生命周期相關的數據時非常有用,因為它可以確保只有當活動或片段處于激活狀態(tài)時,才會接收到更新。
- 工作原理:LiveData的核心是LifecycleOwner,通常是Activity或Fragment。當LiveData對象有新數據時,它會檢查是否有活躍的觀察者,并通知它們。如果觀察者已經銷毀,如Activity已經停止或Fragment已經分離,那么LiveData就不會再發(fā)送通知,從而避免了內存泄漏。
- 使用步驟:要使用LiveData,首先需要在項目的build.gradle文件中添加依賴。然后,可以在ViewModel中創(chuàng)建LiveData對象,并在UI層(如Activity或Fragment)中觀察它。當LiveData對象的數據改變時,UI會自動更新。
- 應用場景:LiveData適用于多種場景,包括但不限于配置更改、網絡狀態(tài)變化、數據庫操作等。它特別適用于需要響應配置更改(如屏幕旋轉)的場景,因為在這些情況下,觀察者可能會被銷毀并重新創(chuàng)建,而LiveData能夠確保在這些過程中不會發(fā)生內存泄漏。
- 雙向綁定:雖然LiveData本身不直接支持雙向綁定,但可以與DataBinding庫結合使用,通過將LiveData對象與UI元素綁定來實現雙向綁定的效果。
- 數據更新:當LiveData中的數據發(fā)生變化時,所有訂閱了該LiveData的觀察者都會收到通知,從而實現UI的自動更新。
- 事件處理:LiveData還提供了Transformations API,允許開發(fā)者對LiveData對象進行轉換和組合,以實現更復雜的數據處理邏輯。
- 高級功能:除了基本的數據持有和通知功能外,LiveData還提供了一些高級功能,如切換地圖類型、設置篩選條件等,這些功能使得LiveData更加靈活和強大。
public class MyViewModel extends ViewModel {private MutableLiveData<Integer> currentSecond;public MutableLiveData<Integer> getCurrentSecond(){if (currentSecond == null){currentSecond = new MutableLiveData<>();currentSecond.setValue(0);}return currentSecond;}
}
public class MainActivity extends AppCompatActivity {private TextView textView;private MyViewModel viewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.getCurrentSecond()));viewModel.getCurrentSecond().observe(this, new Observer<Integer>() {@Overridepublic void onChanged(Integer integer) {textView.setText(String.valueOf(integer));}});startTimer();}private void startTimer(){new Timer().schedule(new TimerTask() {@Overridepublic void run() {// 非ui線程 postValue// ui線程 setValueviewModel.getCurrentSecond().postValue(viewModel.getCurrentSecond().getValue()+1);}},1000,1000);}
}
3.DataBinding
Android DataBinding是Google在Jetpack中推出的一款數據綁定的支持庫,它通過將數據源直接與UI元素進行綁定來實現數據與視圖之間的自動更新。
對DataBinding的詳細介紹:
- 基本概念:DataBinding是一種強大的數據綁定技術,它能夠實現視圖和數據之間的自動更新。開發(fā)者可以將數據直接綁定到視圖上,從而簡化了視圖和數據之間的操作,提高了代碼的可讀性和可維護性。
- 工作原理:DataBinding的工作原理主要依賴于數據綁定引擎和數據對象。數據綁定引擎負責管理數據和視圖之間的關系,當數據發(fā)生變化時,引擎會自動更新視圖。而數據對象則是數據的載體,它可以是任何對象,只要實現了相應的數據接口。
- 使用步驟:啟用DataBinding需要在app module的build.gradle中添加相應代碼。布局文件需要更改為layout節(jié)點并引入data節(jié)點,同時創(chuàng)建好需要用到的Model。在Activity或Fragment中,用DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentView(int layoutId),同時初始化數據,并進行綁定。
- 應用場景:列表展示、條件渲染、數據綁定布局、MVVM架構等都是DataBinding的應用場景。DataBinding與MVVM架構相結合,可以實現更好的代碼分離和組件化開發(fā)。
- 雙向綁定:雙向綁定的效果是數據影響界面,界面變化也要使得數據發(fā)生變化。例如EditText輸入內容時,綁定的數據bean要跟著變化。
- 數據更新:Databinding通過使用實現Observable的數據,當數據更新的時候,自動更新UI。監(jiān)聽對象變化更新。
- 事件處理:事件處理包括方法引用和監(jiān)聽綁定兩種方式。
- 高級功能:DataBinding支持在普通方法上添加@注解來添加自定義控件屬性。這提供了更大的靈活性,允許開發(fā)者根據需要定制控件的行為
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);Idol idol = new Idol("蔡徐坤", "五星");binding.setIdol(idol);}
}
<?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><variablename="idol"type="com.zzzjian.databinding.Idol" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_begin="365dp" /><ImageViewandroid:id="@+id/imageView2"android:layout_width="300dip"android:layout_height="300dip"android:contentDescription="TODO"app:layout_constraintBottom_toTopOf="@+id/guideline"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"android:src="@drawable/ikun"app:layout_constraintTop_toTopOf="parent"tools:src="@tools:sample/avatars" /><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:text="姓名"android:text="@{idol.name}"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline"app:layout_constraintVertical_bias="0.245" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:text="五星"android:text="@{idol.star}"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/guideline" /></androidx.constraintlayout.widget.ConstraintLayout>
</layout>