Android Jetpack -- LiveData篇


LiveData是一個可觀察的數據持有者類,不過它和其他的可觀察對象不同,它會與生命周期相關聯,比如Activity的生命周期,LiveData能確保僅在Activity處於活動狀態下才會更新。也就是說當觀察者處於活動狀態,才會去通知數據更新。
個人覺得這是為了避免內存泄漏,可以說是很實用了,因為要想避免內存泄漏,必須要感知到生命周期,而原本並沒有提供額外的方法,像Glide采用了一個透明的Fragment來感知Activity的生命周期,這雖然是一個可行的方法,但總感覺並不是一個最優的方法。
下面是官方說明的使用LiveData的優點

  • 確保UI與數據同步
  • 不會產生內存泄漏
  • 不會因為Activity停止而Crash
  • 不需要手動控制生命周期

下面便是LiveData在MVVM中的角色

 

 

LiveData的使用

LiveData是配合ViewModel使用的

ViewModelWithLiveData.java

package com.example.livedatatest;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class ViewModelWithLiveData extends ViewModel {
    private MutableLiveData<Integer> LikedNumber;

    public MutableLiveData<Integer> getLikedNumber() {
        if (LikedNumber == null) {
            LikedNumber = new MutableLiveData<>();
            LikedNumber.setValue(0);
        }
        return LikedNumber;
    }
    public void addLikedNumber(int n) {
        LikedNumber.setValue(LikedNumber.getValue() + n);
    }
}

MainActivity.java

package com.example.livedatatest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    ViewModelWithLiveData viewModelWithLiveData;
    TextView textView;
    ImageButton imageButtonLike,imageButtonDisLike;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView.findViewById(R.id.textView);
        imageButtonLike.findViewById(R.id.imageButton);
        imageButtonDisLike.findViewById(R.id.imageButton2);

        viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData.class);
        viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(integer));
            }
        });

        imageButtonLike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelWithLiveData.addLikedNumber(1);
            }
        });

        imageButtonDisLike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelWithLiveData.addLikedNumber(-1);
            }
        });
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM