Android生命周期感知组件介绍(Android lifecycle-aware components)

lifecycle-aware组件介绍

  • ViewModel:为绑定在特定生命周期的对象提供创建以及恢复的方法,ViewModel通常保存View的数据或者用于与其他组件进行通信,例如data repository
  • LifecycleOwner/LifecycleRegisterOwner:LifecycleOwner以及LifecycleRegisterOwner都是需要在AppCompatActivity或者Support Fragment类中实现的接口。可以订阅实现这些接口的其他组件的对象,来观察这些对象的生命周期。
  • LiveData:通过LiveData可以通过多个组件来观察到数据的变化。LiveData不会影响应用中的组件如:Activity、Service、Fragment或者其他LifecycleOwner的生命周期。LiveData可以对观察者订阅的内容进行管理,主要的方式有:停止或者取消订阅。

布局文件中添加计时器

    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Chronometer chronometer=(Chronometer)findViewById(R.id.chronometer);
        chronometer.start();
    }
}

当旋转屏幕时,由于Activity重建,使得计时器被重置

添加ViewMedel

添加ViewModel来保持Activity或者Fragment整个生命周期中的数据.Activity以及Fragment是short-lived类型的对象,它们在用户操作App的过程中会被频繁地创建以及销毁。使用ViewModel也可以很好地处理与网络请求相关的数据,以及数据的操作和持久化。

使用ViewModel来留存计时器(Chronometer)的状态

ChronometerViewModel中的代码

public class ChronometerViewModel extends ViewModel {

    private MutableLiveData<Long>mElapsedTime=new MutableLiveData<>();

    private long mInitialTime;

    public ChronometerViewModel(){
        mInitialTime= SystemClock.elapsedRealtime();

        Timer timer=new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                 final long newValue=(SystemClock.elapsedRealtime()-mInitialTime)/1000;
                 mElapsedTime.postValue(newValue);
            }
        },1000,1000);
    }

    public LiveData<Long>getElapsedTime(){

        return mElapsedTime;
    }
}

在MainActivity中添加代码

     chronometerViewModel= ViewModelProviders.of(this).get(ChronometerViewModel.class);

this指代的是LifecycleOwner的一个实例,ViewModelLifecycleOwner保活时间一样长,当ViewModel的所有者的配置信息(如:屏幕旋转)发生变化时,ViewModel不会被销毁,当其所有者重新被实例化时,会与已经存在的ViewModel重新建立联系。其生命周期如图所示:

这里写图片描述

将Activity中使用的数据使用LiveData进行封装

将计时控件chronometer使用Timer来设置,每隔一秒钟更新一次UI,将相应的代码放在ChronometerViewModel中,而让Activity只保持用户与UI之间的交流操作。

MainActivity中的完整代码


public class MainActivity extends AppCompatActivity {

    private ChronometerViewModel chronometerViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         chronometerViewModel= ViewModelProviders.of(this).get(ChronometerViewModel.class);
         subscribe();

    }

    private void subscribe(){
        final Observer<Long>elapseTimeObserver=new Observer<Long>() {
            @Override
            public void onChanged(@Nullable Long aLong) {

                ((TextView)findViewById(R.id.chronometer_text)).setText(aLong+"秒");
            }
        };
        chronometerViewModel.getElapsedTime().observe(this,elapseTimeObserver);
    }
}

timer每隔一秒通知MainActivity时,MainActivity将会更新一下UI,为避免内存泄漏,ViewModel中没有指向Activity的引用。

ViewModel并不直接改变View,在使用ViewModel中需要配置Activity以及Fragment去观察数据源的变化,当观察到数据源发生变换时UI发生相应的改变,这被称为观察者模式。

注:为了将数据暴露给观察者,需要使用LiveData对数据进行封装

LiveData是一个特殊的可观察类,是lifecycle-aware类型的,只会通知处于活跃状态的观察者。

运行结果:

这里写图片描述这里写图片描述

在旋转屏幕后计时器继续未重置。

源码地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值