Android Architecture Components使用介绍

Posted 智多星张晓锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Architecture Components使用介绍相关的知识,希望对你有一定的参考价值。

接上文。
上文的地址是:Android Architecture Components使用介绍(一)


本文主要讲解ViewModel的使用。

ViewModel是android Architecture Components的重要组成部分,主要为了解决在Activity或者Fragment等其他有生命周期的组件在生命周期发生变化的时候数据的保存问题。



问题的引出

    现在假设有个需求,要做一个计时器,但是需要支持横竖屏。我们知道在横竖屏的时候Activity发生了重绘。会用新的Activity来代替原来的,这个时候原来Activity死掉,原来的数据就被清除了。假设代码如下:

public class ChronoActivity1 extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Chronometer chronometer = findViewById(R.id.chronometer);

        chronometer.start();
    

上述代码完成不了这样的需求,因为每次在Activity重建的时候数据就被清空了。现在有了ViewModel,它的生命周期和他的Owner的生命周期是一样的,在这里,他的生命周期就是Application的生命周期。我们可以改写代码如下:

/**
 * A ViewModel used for the @link ChronoActivity2.
 */
public class ChronometerViewModel extends ViewModel 

    @Nullable
    private Long mStartTime;

    @Nullable
    public Long getStartTime() 
        return mStartTime;
    

    public void setStartTime(final long startTime) 
        this.mStartTime = startTime;
    

然后Activity部分的代码如下:

public class ChronoActivity2 extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // The ViewModelStore provides a new ViewModel or one previously created.
        ChronometerViewModel chronometerViewModel
                = ViewModelProviders.of(this).get(ChronometerViewModel.class);

        // Get the chronometer reference
        Chronometer chronometer = findViewById(R.id.chronometer);

        if (chronometerViewModel.getStartTime() == null) 
            // If the start date is not defined, it's a new ViewModel so set it.
            long startTime = SystemClock.elapsedRealtime();
            chronometerViewModel.setStartTime(startTime);
            chronometer.setBase(startTime);
         else 
            // Otherwise the ViewModel has been retained, set the chronometer's base to the original
            // starting time.
            chronometer.setBase(chronometerViewModel.getStartTime());
        

        chronometer.start();
    

以上我们就完成了上述需求。

以上是关于Android Architecture Components使用介绍的主要内容,如果未能解决你的问题,请参考以下文章

Android-architecture之MVCMVPMVVMData-Binding

如何评价Google IO 17发布Android Architecture Components

Android Clean Architecture中的登录流程

Android System Architecture

Android Architecture Components--项目实战

Android Architecture Components使用介绍