首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mvvm处理方向更改和资源清理

如何使用mvvm处理方向更改和资源清理
EN

Stack Overflow用户
提问于 2018-01-08 00:02:55
回答 1查看 693关注 0票数 0

我试着用数据绑定来阻止mvvm架构。下面我写了一个简单的例子:从网络段开始加载数据。基本的,它起作用。

但我有一些问题。

1)当方向发生变化时,会从网络中重新加载数据,因为loadFromNetwork()调用了onViewCreated。ViewModel没有重新编码,那么有什么正确的解决方案来避免重新加载数据?我应该在ViewModel中实现“缓存”,还是在视图(片段)中进行检查?

2)当Ui破坏时,我们需要处理网络操作。在哪里放置这些清理(注意:subscribe方法返回Disposable)?

fragment_my.xml

代码语言:javascript
复制
<layout 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">

    <data>
        <import type="android.view.View" />
        <import type="com.xxx.State" />
        <variable
            name="viewModel"
            type="com.xxx.MyViewModel" />
    </data>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.myPojo.data}" />
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:visibility="@{viewModel.state == State.LOADING ? View.VISIBLE : View.GONE}" />
    </FrameLayout>

</layout>

MyViewModel.kt

代码语言:javascript
复制
class MyViewModel() : ViewModel() {

    val state = ObservableField(State.LOADING)

    val myPojo = ObservableField<MyPojo>()

    @Inject
    lateinit var netApi: NetworkApi

    init {
        Injector.getAppComponent().inject(this)
    }

    fun loadFromNetwork() {
        state.set(State.LOADING)

        netApi.getMyPojo().subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    state.set(State.SUCCESS)
                    myPojo.set(it)
                }, {
                    state.set(State.ERROR)
                })
    }

}

MyFragment.kt

代码语言:javascript
复制
class MyFragment : Fragment(){

    private lateinit var mBinding: FragmentMyBinding
    private lateinit var mViewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_my, container, false)
        return mBinding.root
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mBinding.viewModel = mViewModel

        mViewModel.loadFromNetwork()
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-01-08 15:23:51

您可以将数据持久化到首选项或sqlite数据库,以避免每次从网络中获取数据。假设你不想这么做,我可以想到两种选择。首先,在saveInstanceState onDestroy中将数据存储到包中并在onCreate中读取数据的标准方法。其次,如果您有一个singleTop "main“活动或片段,我已经成功地将ViewModel静态化,并将其用作维护实例状态的一种方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48142730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档