美文网首页
BiBi - Mvvc(Jetpack)

BiBi - Mvvc(Jetpack)

作者: 奋飞的蜗牛ing | 来源:发表于2018-12-13 17:12 被阅读18次

1、Lifecycles

  • 平时做的可能就是在View中的每个周期调用Present中获取数据的方法,然后在调用View的回调接口更新UI,但现在使用Lifecycles可以使用注解和观察的模式自动调用Observe中定义好的方法。

创建Observer,LifecycleObserver是一个标记接口。

class MyObserver implements LifecycleObserver {
  Lifecycle lifecycle;
  CallBack callBack;

  MyObserver(Lifecycle lifecycle, CallBack callback) {
    this.lifecycle = lifecycle;
    this.callBack = callback;
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
  public void connectOnCreate() {
    update("connectOnCreate");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
  public void connectOnResume() {
    update("connectOnResume");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
  public void disConnectOnDestroy() {
    update("disConnectOnDestroy");
  }

  private void update(String str) {
    callBack.update(str);
  }

  public interface CallBack {
    void update(String str);
  }
}

创建Activity并实现LifecyclesOwner。

public interface LifecycleOwner {
    Lifecycle getLifecycle();
}
public class TestActivity extends AppCompatActivity implements LifecycleOwner {
  LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
  MyObserver myObserver = new MyObserver(lifecycleRegistry,
      str -> Toast.makeText(TestActivity.this, str, Toast.LENGTH_SHORT).show());

  @NonNull
  public Lifecycle getLifecycle() {
    return lifecycleRegistry;
  }

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    lifecycleRegistry.addObserver(myObserver);
    lifecycleRegistry.markState(Lifecycle.State.CREATED);
  }

  @Override
  protected void onResume() {
    super.onResume();
    lifecycleRegistry.markState(Lifecycle.State.RESUMED);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    lifecycleRegistry.markState(Lifecycle.State.DESTROYED);
  }
}

AppCompatActivity继承SupportActivity,而SupportActivity本身就实现了LifecycleOwner,上述TestActivity中的很多操作都已经在SupportActivity中完成了,那么上述的使用可以直接更简化为:

public class TestActivity extends AppCompatActivity implements LifecycleOwner {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyObserver myObserver = new MyObserver(getLifecycle(),
        str -> Toast.makeText(TestActivity.this, str, Toast.LENGTH_SHORT).show());
    getLifecycle().addObserver(myObserver);
  }
}

SupportActivity在onCrate的方法中初始化了一个ReportFragment,ReportFragment在其生命周期中dispatch相应的Event生命周期,如 dispatch(Lifecycle.Event.ON_CREATE);

        ReportFragment.injectIfNeededIn(this);

原文:https://blog.csdn.net/Alexwll/article/details/80638905

@OnLifecycleEvent:运行注解

// LifecycleOwner使用了弱引用
private final WeakReference<LifecycleOwner> mLifecycleOwner;
public LifecycleRegistry(@NonNull LifecycleOwner provider) {
      mLifecycleOwner = new WeakReference<>(provider);
      mState = INITIALIZED;
}
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
      State next = getStateAfter(event);
      moveToState(next);
}
// Fragment中调用
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);

2、ViewModel

 SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
  • 使用onSaveInstanceState()方法从中恢复其数据 onCreate(),但此方法仅适用于可以序列化然后反序列化的少量数据,如果要恢复的数据量比较大,此时就时VIewModel的厉害之处了。ViewModel之所以能在Activity重建时保存并恢复数据,因为Activity初次创建时会初始化创建VIewModel,在Activity销毁时,ViewModel对象不会销毁,在新的Activity重新创建后,仍然会执行之前的获取ViewModel的过程,Android系统采取了处理机制,使现在拿到的ViewModel就是前一次创建的对象。

  • 因为ViewModel在Activity销毁时是不会重新创建的,这也意味者ViewModel中不可以引用Activity的对象,否则会有内存泄露的问题,那么当Model中需要Context呢?Android为我们提供了AndroidViewModel,只需继承AndroidViewModel即可

  • ViewModel原理:将数据保存到ViewModel中,然后为活动中添加一个HolderFragment,HolderFragment中保存了ViewStore的实例,ViewStore中使用Map保存了ViewModel,从而在活动重新创建时获取到原来的ViewModel

  • HolderFragment中保存了ViewStore的实例

  • 如何保证两次创建的activity(旋转前后)获取到的为同一个ViewModel?在获取Fragment时,创建过HolderFragment后,会保存在Map中,Map的键就是Activity的实例,所以无论多少次创建都是此Activity的实例,也就获得唯一的一个对应的Fragment。

  • 传入的Activity的对象一致,那获取到就是同一个Fragment,存储的也是同一个ViewStore,那设想一下,如果一个Activity中有多个Fragment,利用这个特性就可以实现Fragment之间数据交互,例如:两个Fragment之间。一个显示标题列表,点击某一个标题,另一个Fragment显示内容,此时使用一个ViewModel实现两者的传递。

原文:https://blog.csdn.net/Alexwll/article/details/82459614

3、LiveData

  • LiveData是一个具有生命周期感知特性的可观察的数据保持类,使用LiveData保存数据时,在每次订阅或数据更新时会自动回调设置的观察者从而更新数据,真正的实现了数据驱动的效果。
  • LiveData的创建基本会在ViewModel中,从而使数据在界面销毁时继续保持。
  • LiveData 认为观察者的生命周期处于STARTED状态或RESUMED状态下,表示观察者处于活动状态,LiveData只通知活跃的观察者更新数据。
  • 注册一个实现该LifecycleOwner 接口的对象配对的观察者,当相应Lifecycle对象的状态改变为DESTROYED时移除观察者
class TestViewModel : ViewModel() {
    var mCurrent: MutableLiveData<String>? = null
        get() {
            if (field == null) {
                field = MutableLiveData() // 创建一个LiveData实例来保存某种类型的数据
            } // LiveData对象必须在ViewModel中
            return field
        }
}
-------------------------
val nameObservable = Observer<String> {   // 创建观察者对象
    textView.text = it       // 创建一个定义onChanged()方法的Observer对象,在数据变化时回调
}
-------------------------
// 使用LifecycleOwner的observe() 方法将观察者对象附加到LiveData对象,这将观察对象向LiveData对象订阅,以便通知其更改
mModel = ViewModelProviders.of(this).get(TestViewModel::class.java)
// mCurrent 订阅观察
mModel.mCurrent!!.observe(this, nameObservable) 


原文:https://blog.csdn.net/Alexwll/article/details/82996003

4、Navigation

  • 导航架构组件简化了Android应用程序中导航的实现,通过在xml中添加元素并指定导航的起始和目的地,从而在Fragment之间建立连接在Activity中调用xml中设置的导航action从而跳转界面到目的地。Navigation多数作用于Fragment中。
<navigation 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"
            android:id="@+id/second" app:startDestination="@id/fragmentT">
 
    <fragment android:id="@+id/fragmentT" android:name="com.example.administrator.navigation.FragmentT"
              android:label="fragment_fragment_t" tools:layout="@layout/fragment_fragment_t">
        <action android:id="@+id/action_fragmentT_to_fragmentOther" app:destination="@id/fragmentOther"/>
    </fragment>
 
    <fragment android:id="@+id/fragmentOther" android:name="com.example.administrator.navigation.FragmentOther"
              android:label="fragment_fragment_other" tools:layout="@layout/fragment_fragment_other"/>
</navigation>
btnActivity.setOnClickListener {
    val option = ActivityOptionsCompat.makeSceneTransitionAnimation(activity as Activity, imageView, "image")
    val exeras = ActivityNavigator.Extras(option)
    Navigation.findNavController(btnFragment)
        .navigate(R.id.action_blankFragment_to_secondActivity2, null, null, exeras)

原文:https://blog.csdn.net/Alexwll/article/details/83244004

相关文章

网友评论

      本文标题:BiBi - Mvvc(Jetpack)

      本文链接:https://www.haomeiwen.com/subject/mjqmcqtx.html