Android之AAC架构尝试
16lz
2021-01-25
一、AAC架构的前世今生
1、关于AAC需先了解一下Android Jetpack,Jetpack 是 Android 软件组件的集合,使您可以更轻松地开发出色的 Android 应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您可以专注于您关心的代码。Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它提供向后兼容性并且比 Android 平台更频繁地更新,从而确保您始终可以获取最新且最好的 Jetpack 组件版本。
2、Android Jetpack的优势
(1)组件是为协同工作而构建的,不过也可以单独采用,同时利用 Kotlin 语言功能帮助您提高工作效率;
(2)Android Jetpack 可管理繁琐的 Activity(如后台任务、导航和生命周期管理),以便您可以专注于具体业务;
(3)Android Jetpack 组件围绕现代化设计实践构建而成,具有向后兼容性,可以减少崩溃和内存泄漏。
3、Android Architecture Components(简称AAC),它是一套新的MVVM架构组件,使App的架构更加健壮,是Android Jetpack的架构组件具有可帮助管理界面组件生命周期、处理数据持久性等的类,以声明方式将可观察数据绑定到界面元素。
相关的API类:
二、代码实战
1、定义model类(省略get 、set方法)
public class NewsDataVo { private String id; private String newsTitle; private String newsContent; private String newsUrl; private int readNum;}
2、定义ViewModel
public class NewsViewModel extends AndroidViewModel { private MutableLiveData mData; private LiveData switchDataMap; LiveData getSwitchDataMap() { return switchDataMap; } public NewsViewModel(@NonNull Application application) { super(application); mData = new MutableLiveData<>(); switchDataMap = Transformations.switchMap(mData, new Function>() { @Override public LiveData apply(NewsDataVo input) { MutableLiveData temp = new MutableLiveData<>(); temp.setValue(input); return temp; } }); } /** * 模拟获取网络数据 */ void httpGetData() { int len = 10; for (int i = 0; i < len; i++) { NewsDataVo dataVo = new NewsDataVo(); dataVo.setId("1223" + i); dataVo.setNewsTitle("Android AccArchitecture框架简介" + i); dataVo.setNewsContent("Android Architecture Components,简称 AAC,一个处理UI的生命周期与数据的持久化的架构" + i); dataVo.setReadNum(i); mData.setValue(dataVo); } }}
3、定义LifecycleObserver管理View(Activity、Fragment)的生命周期
public class AccLifecycleObserver implements LifecycleObserver { private Context context; private String tag; AccLifecycleObserver(Context context) { this.context = context; tag = context.getClass().getSimpleName(); } @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void onCreate() { Log.i(tag, "onCreate-----" + context.getClass()); } @OnLifecycleEvent(Lifecycle.Event.ON_START) public void onStart() { Log.i(tag, "onStart-----" + context.getClass()); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume() { Log.i(tag, "onResume-----" + context.getClass()); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void onPause() { Log.i(tag, "onPause-----" + context.getClass()); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop() { Log.i(tag, "onStop-----" + context.getClass()); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void onDestroy() { Log.i(tag, "onDestroy-----" + context.getClass()); }}
4、View层交互
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private MainActivity mActivity; private NewsViewModel newsViewModel; private DataAdapter dataAdapter; private List mData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); addObserver(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.do_btn_tv: newsViewModel.httpGetData(); break; default: break; } } public void initView() { mActivity = this; mData = new ArrayList<>(); dataAdapter = new DataAdapter(mData); findViewById(R.id.do_btn_tv).setOnClickListener(this); RecyclerView recyclerView = findViewById(R.id.data_list_rv); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); recyclerView.setAdapter(dataAdapter); } private void addObserver() { AccLifecycleObserver observer = new AccLifecycleObserver(mActivity); getLifecycle().addObserver(observer); ViewModelProvider.AndroidViewModelFactory instance = ViewModelProvider.AndroidViewModelFactory.getInstance(AccApp.sInstance); newsViewModel = instance.create(NewsViewModel.class); newsViewModel.getSwitchDataMap().observe(mActivity, new Observer() { @Override public void onChanged(@Nullable NewsDataVo dataVo) { assert dataVo != null; mData.add(dataVo); dataAdapter.notifyDataSetChanged(); } }); } class DataAdapter extends RecyclerView.Adapter { private List mData; DataAdapter(List mData) { this.mData = mData; } @NonNull @Override public ViewData onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { return new ViewData(LayoutInflater.from(mActivity).inflate(R.layout.news_item, viewGroup, false)); } @Override public void onBindViewHolder(@NonNull ViewData viewData, int i) { NewsDataVo newsDataVo = mData.get(i); viewData.numTv.setText(newsDataVo.getReadNum() + "人阅读"); viewData.titleTv.setText(newsDataVo.getNewsTitle()); viewData.contentTv.setText(newsDataVo.getNewsContent()); } @Override public int getItemCount() { return mData.size(); } class ViewData extends RecyclerView.ViewHolder { private ImageView imageView; private TextView titleTv; private TextView contentTv; private TextView numTv; public ViewData(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.image_iv); titleTv = itemView.findViewById(R.id.title_tv); contentTv = itemView.findViewById(R.id.content_tv); numTv = itemView.findViewById(R.id.read_num_tv); } } }
布局xml文件
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
更多相关文章
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- [置顶] Intent filter 关于Action、Category属性详解---附带实例
- Android(安卓)四大组件 —— 服务
- Android开发之UI线程和非UI线程
- Android应用程序的4个组件
- 摘抄:Android:应用程序的生命周期
- Android(安卓)framework 应用进程如何启动
- Android面试之Activity生命周期
- Android(安卓)布局简要范例