高德天气应用开发之十五:android ViewModel 使用方法(管理&存储天气UI相关的数据,并解耦UI生命周期)

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正,谢谢! https://blog.csdn.net/cbk861110/article/details/86670703

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

-------------------------------------------

基于MVVM框架的高德天气APP:


MVVM框架和组件实现:

  • ViewModels: 一种可以被观察的以及可以感知生命周期的数据容器。

一、 技术背景:

1. ViewModels 为Android推荐使用的数据存储&管理类;

2. ViewModel类被设计成以一种有意识的生命周期方式存储和管理ui相关的数据,ViewModel类允许数据在配置更改(如屏幕旋转)中存活。

3. 数据&数据的管理从UI中剥离独立出来,简化UI(Activity&fragment等)的代码复杂度,便于后续代码维护;

二、 实现方式(以天气主页为例):

1. 天气主页对应的ViewModel 实现方式(存储&管理主页UI相关的数据,及数据对应的操作处理):

public class MainActivityViewModel extends AndroidViewModel {
    private final String[] mCityNames =
            new String[]{"深圳", "西安", "合肥", "武汉"};
    private final String[] mCityAdcode =
            new String[]{"440300", "610100", "340100", "420100"};

    private final Map<CityBean, CityWeatherRecyclerAdapter> mAdapterDatas = new HashMap<>();
    private MutableLiveData<CityBean> mCurCityBean = new MutableLiveData<>();
    private MutableLiveData<List<CityBean>> mCityBeans = new MutableLiveData<>();
    private Map<CityBean, List<BaseItemBean>> mCityWeatherDatas = new HashMap<>();

    public MainActivityViewModel(@NonNull Application application) {
        super(application);

        List<CityBean> data = new ArrayList<>();
        for (int i = 0; i < mCityNames.length; i++) {
            CityBean cityBean = new CityBean(mCityNames[i], mCityAdcode[i]);
            data.add(cityBean);
            mAdapterDatas.put(cityBean, new CityWeatherRecyclerAdapter());
        }
        mCityBeans.setValue(data);
    }

    public void loadCurCityInfo(CityBean cityBean) {
        mCurCityBean.setValue(cityBean);
    }

    public MutableLiveData<CityBean> getCurCityInfo() {
        return mCurCityBean;
    }

    public List<CityBean> getCityInfoList() {
        return mCityBeans.getValue();
    }
}

2. 天气主页 与对应的ViewModel关联实现(WtMainActivity.java中实现):

public class WtMainActivity extends BaseActivity {
    private MainActivityViewModel mViewModel;
    private ActionBar mActionBar;
    private ViewPager mViewPager;
    private CityPagerAdapter mCityPagerAdapter;
    private PageIndicatorView mPageIndicatorView;

    @Override
    protected void onCreateNew(Bundle savedInstanceState) {
        //super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_weather_main);
        initView();
    }

    private void initView(){
        mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class); //关联方法

        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mCityPagerAdapter = new CityPagerAdapter(this, mViewModel);
        mViewPager.setAdapter(mCityPagerAdapter);
        mViewModel.registerPageChangeListener(mViewPager);

        mPageIndicatorView = findViewById(R.id.page_indicatior);
        mPageIndicatorView.registerPageChangeListener(mViewPager);
    }

    @Override
    protected void onResume() {
        if (mViewModel != null) {
            mViewModel.loadCurCityInfo(new CityBean("深圳", "440300"));
        }
        super.onResume();
    }
}

-------------------------------------------

文章目录(未完,待续):

一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564

二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655

三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790

四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964

五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321

六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392

七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573

八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664

九:android ThreadPoolExecutor线程池 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667101

十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667375

十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178

十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708

十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354

十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531

十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703

十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849

-------------------------------------------

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/86670703