ViewModel+LiveData总结

本文总结了Android开发中ViewModel与LiveData的使用,包括它们的优势,如生命周期感知、解耦合等。分析了ViewModel的创建、生命周期、与Context的交互,以及LiveData的源码和Transformations的运用。此外,还探讨了与MVP模式的区别。
摘要由CSDN通过智能技术生成

ViewMode+LiveData总结

Activity/Fragment只应关注UI,而不应关系操作逻辑,因此操作逻辑应放到Viewmodel中去
下面是我手画的数据流图:
在这里插入图片描述
首先有FragmentViewModelLivedata这三个对象。

  1. Fragment观察Viewmodel的Livedata数据,如果livedata的值改变会通知Frament。
  2. ViewModel获取数据(网络、数据库),然后设置Livedata的值
  3. Livedata的值改变就通知Fragment
  4. Fragment刷新界面

代码如下:
Fragment


import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;

/**
*
* @date 2020/9/19
*/
public class MyActivity extends AppCompatActivity {
   Handler messageHandler;
   MyViewModel myViewModel;
   Handler mainHandler;

   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       final TextView textView = findViewById(R.id.textView);
       // 新建ViewModel
       myViewModel = new MyViewModel();

       // 子线程
       HandlerThread handlerThread = new HandlerThread("");
       handlerThread.start();
       // 子线程Handler
       messageHandler = new Handler(handlerThread.getLooper());
       // 主线程handler
       mainHandler = new Handler(getMainLooper());
       // 开启自自线程改变数据
       messageHandler.post(new Runnable() {
           @Override
           public void run() {
               int i = 0;
               while (i < 100) {
                   mainHandler.post(new Runnable() {
                       @Override
                       public void run() {
                           myViewModel.requestChangeText();
                       }
                   });
                   try {
                       Thread.sleep(500);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   i++;
               }
           }
       });

       myViewModel.getmText().observe(this, new Observer<String>() {
           @Override
           public void onChanged(final String s) {
               runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       textView.setText(s);
                   }
               });

           }
       });
   }
}

viewmodel


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

import java.util.Observable;
import java.util.Random;

/**
 * Describe:<p></p>
 * 描述:<p></p>
 *
 * @date 2020/9/19
 */
public class MyViewModel extends ViewModel implements IMyModelHelper {


    private MutableLiveData<String> mText = new MutableLiveData<String>();

    public MyViewModel() {
    }

    public MutableLiveData<String> getmText() {
        return mText;
    }

    @Override
    public void requestChangeText() {
        changeText();
    }

    private void changeText(){
        getmText().setValue(new Random(10).toString());
    }
}
package com.loyal888.tets;

/**
 * Describe:<p></p>
 * 描述:<p></p>
 *
 * @date 2020/9/19
 */
public interface IMyModelHelper  {
   
    void requestChangeText();
}

总结:数据通知可以使用Observer,实现进一步解耦合

MVP 和MVVM的区别

在这里插入图片描述

获取VidewModel实例

// 新建ViewModel
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

VideoModel的生命周期

系统首次调用 Activity 对象的 onCreate() 方法时请求 ViewModel。系统可能会在 Activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel 存在的时间范围是从您首次请求 ViewModel 直到 Activity 完成并销毁。

在当前生命周期为Destrory的时候,清除了mViewModelStore
在这里插入图片描述

ViewModel中使用Context

扩展AndroidViewModel

ViewModel 对象可以包含 LifecycleObservers,如 LiveData 对象。但是,ViewModel 对象绝不能观察对生命周期感知型可观察对象(如 LiveData 对象)的更改。 如果 ViewModel 需要 Application 上下文(例如,为了查找系统服务),它可以扩展 AndroidViewModel 类并设置用于接收 Application 的构造函数,因为 Application 类会扩展 Context。

ViewModel源码分析

1. ViewModelProvider.of(this)

  • 检查应用的上下文
  • 构造了AndroidViewModelFactory
  • 返回provider
   public static ViewModelProvider of(@NonNull FragmentActivity activity) {
   
        return of(activity, null);
    }
    
    @NonNull
    @MainThread
    public static ViewModelProvider of(@NonNull FragmentActivity activity,
            @Nullable Factory factory) {
   
        // 1. 检查应用的上下文且必须是application
        Application application = checkApplication(activity);
        if (factory == null) {
   
        // 2.构造了AndroidViewModelFactory
            factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        // 3.返回provider
        // 3.1 注意这里的activity.getViewModelStore()
        return new ViewModelProvider(activity.getViewModelStore(), factory);
    }

2. activity.getViewModelStore()

public ViewModelStore getViewModelStore() {
   
        if (getApplication() == null) {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值