热文导读 | 点击标题阅读
金九银十跳槽季如何进阶找到合适满意的工作?
阿里员工吐槽:我在阿里工作五年,面试一个小公司竟然挂了
一篇文章搞懂Android组件化
作者:Hacknife (文末附源码地址)
地址:http://www.apkbus.com/blog-976112-79418.html
闲话不多少,还是老套路,处理一个登陆的业务。详细的介绍MVVM我就不多说了,网上一大把,毕竟吹水还是我的弱项。
主要实现的功能有两个输入框,一个登陆按钮,两个TextView显示登陆结果。
秀一把我的LoginActivity
@BindLayout(R.layout.activity_login)
public class LoginActivity extends BaseActivity<ILoginViewModel, LoginActivityBriefnessor> implements ILoginView {
@Override
protected ILoginViewModel createViewModel(LoginActivityBriefnessor briefnessor) {
return new LoginViewModel(this, briefnessor);
}
}
是不是超级简洁,点击事件呢?怎么不见了,再看一看ViewModel
public class LoginViewModel extends BaseViewModel<ILoginView, ILoginModel, LoginActivityBriefnessor> implements ILoginViewModel {
public LoginViewModel(ILoginView view, LoginActivityBriefnessor briefnessor) {
super(view, briefnessor);
}
@Override
protected ILoginModel createModel() {
return new LoginModel(this);
}
@Override
public void onLoginClick(String account, String pswd) {
if (account.length() < 3) {
Toast.makeText(context(), "账号不正确", Toast.LENGTH_SHORT).show();
return;
}
if (pswd.length() < 3) {
Toast.makeText(context(), "密码不正确", Toast.LENGTH_SHORT).show();
return;
}
model.login(account, pswd);
}
@Override
public void callbackLogin(LoginResult result) {
briefnessor.setResult(result);
}
}
ViewModel制作了登陆的数据验证,以及登陆回调的实现,model层完成模拟了登陆。
整个登陆的业务流程Activity并没有参与,在这其中就不得不提一个关键的中间件Briefness,它连接了View层与Model层,帮我们实现了数据绑定,以及事件传递。
我们先看一看布局是如何实现的
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:imports="com.hacknife.demo.bean.LoginResult,result"a
app:viewModel="com.hacknife.demo.mvvm.viewmodel.ILoginViewModel"
tools:ignore="MissingPrefix">
<EditText
android:id="@+id/et_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="40dp"
android:layout_marginVertical="10dp"
android:hint="账号" />
<EditText
android:id="@+id/et_pswd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="40dp"
android:layout_marginVertical="10dp"
android:hint="密码" />
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginHorizontal="40dp"
android:layout_marginVertical="10dp"
android:text="登陆"
app:transfer="onLoginClick($et_account$,$et_pswd$)" />
<LinearLayout style="@style/text_parent" android:layout_marginHorizontal="40dp">
<TextView
style="@style/text_childer"
android:text="返回码" />
<TextView
android:id="@+id/tv_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:bind="$result.code$" />
LinearLayout>
<LinearLayout style="@style/text_parent" android:layout_marginHorizontal="40dp">
<TextView
style="@style/text_childer"
android:text="结果:" />
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:bind="$result.msg$" />
LinearLayout>
LinearLayout>
布局中,根布局绑定了ViewModel,以及用于展示登陆结果的数据源。登陆按钮传递单击登陆事件,剩下的两个textView绑定相应的字段。
同时在对应的Activity上绑定相应的布局文件,Briefness就能暂时他强大的功能了,它会自动生成[类名+Briefnessor]的类。
public class LoginActivityBriefnessor implements Briefnessor<LoginActivity> {
public EditText et_account;
public EditText et_pswd;
public Button btn_login;
public TextView tv_code;
public TextView tv_msg;
public LoginResult result;
public ILoginViewModel viewModel;
@Override
public void bind(final LoginActivity host, Object source) {
if (!Utils.contentViewExist(host)) {
host.setContentView(R.layout.activity_login);
}
et_account = (EditText) host.findViewById(R.id.et_account);
et_pswd = (EditText) host.findViewById(R.id.et_pswd);
btn_login = (Button) host.findViewById(R.id.btn_login);
tv_code = (TextView) host.findViewById(R.id.tv_code);
tv_msg = (TextView) host.findViewById(R.id.tv_msg);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.onLoginClick(et_account.getText().toString().trim() , et_pswd.getText().toString().trim());
}
});
}
@Override
public void clear() {
this.result = null;
this.viewModel = null;
}
@Override
public void clearAll() {
this.result = null;
this.viewModel = null;
this.et_account = null;
this.et_pswd = null;
this.btn_login = null;
this.tv_code = null;
this.tv_msg = null;
}
@Override
public void bindViewModel(Object viewModel) {
this.viewModel = (ILoginViewModel) viewModel;
}
public void setResult(LoginResult result) {
if (result == null) return;
this.result = result;
BriefnessInjector.injector(tv_code,result.getCode());
BriefnessInjector.injector(tv_msg,result.getMsg());
}
}
该类实现了数据绑定,以及向ViewModel发送消息附带输入框中的值。
Briefness的具体用法,请参考https://github.com/hacknife/briefness
下面说一说BaseActivity
public abstract class BaseActivity<T extends IBaseViewModel,B extends Briefnessor> extends AppCompatActivity implements IBaseView {
protected T viewModel;
protected B briefnessor;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
briefnessor = (B )Briefness.bind(this);
viewModel = createViewModel(briefnessor);
briefnessor.bindViewModel(viewModel);
initView();
}
protected abstract T createViewModel(B briefnessor);
@Override
protected void onDestroy() {
super.onDestroy();
if (viewModel != null)
viewModel.dettachView();
}
protected void initView() {
}
@Override
public Context applicationContext() {
return getApplication();
}
@Override
public Activity context() {
return this;
}
}
BaseActivity中初始化了Briefness并创建ViewModel绑定到Briefness,并实现了IBaseView
public interface IBaseView {
Context applicationContext();
Activity context();
}
BaseViewModel继承AbsViewmodel并实现IBaseViewModel,持有Briefnessor,View,Model。
public abstract class BaseViewModel<V extends IBaseView, M extends IBaseModel, B extends Briefnessor> extends AbsViewModel<V> implements IBaseViewModel {
protected V view;
protected M model;
protected B briefnessor;
public BaseViewModel(V view, B briefnessor) {
this.attachView(view);
this.attachBriefnessor(briefnessor);
this.view = getView();
this.briefnessor = (B) getBriefnessor();
model = createModel();
}
protected abstract M createModel();
@Override
public Context applicationContext() {
return view.applicationContext();
}
@Override
public Activity context() {
return view.context();
}
}
AbsViewModel 的作用主要是释放相应的连接关系。
public abstract class AbsViewModel<T> implements IBaseViewModel{
protected WeakReference mViewRef;
protected WeakReference mBriefnessorRef;
protected void attachView(T view) {
mViewRef = new WeakReference(view);
}
protected void attachBriefnessor(Briefnessor briefnessor) {
mBriefnessorRef = new WeakReference(briefnessor);
}
protected T getView() {
return mViewRef.get();
}
protected Briefnessor getBriefnessor() {
return mBriefnessorRef.get();
}
public boolean isViewAttached() {
return mViewRef != null && mViewRef.get() != null & mBriefnessorRef != null & mBriefnessorRef.get() != null;
}
public void dettachView() {
if (mViewRef != null) {
mViewRef.clear();
mViewRef = null;
}
if (mBriefnessorRef != null) {
mBriefnessorRef.clear();
mBriefnessorRef = null;
}
}
}
BaseModel 持有ViewModel,并实现了IBaseView。
public abstract class BaseModel<VM extends IBaseViewModel> implements IBaseModel {
protected VM viewModel;
public BaseModel(VM viewModel) {
this.viewModel = viewModel;
}
@Override
public Context applicationContext() {
return viewModel.applicationContext();
}
@Override
public Activity context() {
return viewModel.context();
}
}
写的不好,请多多见谅,毕竟小学都没毕业
如果还有什么不明白的,代码直通车
https://github.com/hacknife/Briefness/tree/master/example/src/main/java/com/hacknife/demo/mvvm
想进阿里吗?快加入我们的知识星球吧,如下:
如有收获,欢迎「分享 」
「点赞」「评论 」
妈妈常教导我,让我养成良好习惯。这样长大才能成为一个有用的人。良好的习惯是尊敬师长这样长大才能成为一个有用的人。良好的习惯是尊敬师长,爱护同学,对人有礼貌;是不粗心,做事情不拖拉;还是爱护公物,不浪费粮食。为什么呢?因为拥有良好习惯,做一个品德高尚的人,懂得尊重别人,才会得到别人的尊重。我要努力地做到这些。我有一些坏习惯,有时候学习很粗心,把一些会做的题做错。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃饭很慢,有的时候还剩饭。我还起床磨蹭,本来应该迅速地穿好衣服,但是,我总是磨磨蹭蹭地,速度很慢。“我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!” 在上幼儿园以前,我什么也不会干,就连穿衣服也是妈妈给我穿好,就要上幼儿园了,这样可不行,妈妈锻炼我要学会自己穿衣服。 有一天,妈妈把衣服摆在我面前,开始让我自己穿。一开始。我又哭又叫就是不穿,还把衣服扔的满地都是,然后坐在地上开始大哭,等了好长时间,妈妈还是不理我,我只好自己乖乖的把衣服穿好, 一出了房间门,妈妈就笑了起来,再看看我的衣服,毛衣和裤子都穿反了,我赶紧回房间又重新穿了一遍,这次穿好了,拿起外套,可是外套的扣子又扣不上了,扣子可调皮了,好像故意和我作对,我把扣子往扣眼——人类邪恶的根源;爱情——幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话:幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话“亲爱的!擦干你的眼泪,至高无上的爱情已经打开了我们的眼界,使我们成了它的崇拜者。是它,
妈妈常教导我,让我养成良好习惯。这样长大才能成为一个有用的人。良好的习惯是尊敬师长这样长大才能成为一个有用的人。良好的习惯是尊敬师长,爱护同学,对人有礼貌;是不粗心,做事情不拖拉;还是爱护公物,不浪费粮食。为什么呢?因为拥有良好习惯,做一个品德高尚的人,懂得尊重别人,才会得到别人的尊重。我要努力地做到这些。我有一些坏习惯,有时候学习很粗心,把一些会做的题做错。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃饭很慢,有的时候还剩饭。我还起床磨蹭,本来应该迅速地穿好衣服,但是,我总是磨磨蹭蹭地,速度很慢。“我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!我打算在这学期里,改掉这些坏习惯。早上起来,迅速地穿好衣服,不拖拉。学习不粗心,仔细完成每一道题。吃饭的时候,要很快的把饭吃完,不剩饭。我要从一点一滴做起,逐渐养成良好习惯。我相信自己一定能成为一名品学兼优的好学生!” 在上幼儿园以前,我什么也不会干,就连穿衣服也是妈妈给我穿好,就要上幼儿园了,这样可不行,妈妈锻炼我要学会自己穿衣服。 有一天,妈妈把衣服摆在我面前,开始让我自己穿。一开始。我又哭又叫就是不穿,还把衣服扔的满地都是,然后坐在地上开始大哭,等了好长时间,妈妈还是不理我,我只好自己乖乖的把衣服穿好, 一出了房间门,妈妈就笑了起来,再看看我的衣服,毛衣和裤子都穿反了,我赶紧回房间又重新穿了一遍,这次穿好了,拿起外套,可是外套的扣子又扣不上了,扣子可调皮了,好像故意和我作对,我把扣子往扣眼——人类邪恶的根源;爱情——幸福和光明的源泉。我一直在这些思想的舞台上徘徊。突然我发现两个身影从我面前经过,坐在不远的草地上。这是一对从农田那边走过来的青年男女。农田那边有农民的茅舍。在一阵令人伤心的沉默之后,随着一声长叹,我听见从一个肺痨病人的嘴里说出了这样的话:“亲爱的!擦干你的眼泪,至高无上的爱情已经打开了我们的眼界,使我们成了它的崇拜者。是它,
如你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可
最后,国庆福利来了,我们的知识星球已达到1000人了,之前说过到达1000人时将大大幅涨价到169元,为了反馈大家对我们的关注和厚爱,特此维持现价99元最后一天,今天后(今晚 00:00)后将涨到169元,欢迎大家加入我们的知识星球,更多星球信息参见:
如何进阶成为Java和Android架构师?
金九银十跳槽季如何进阶找到合适满意的工作?
说两件事
微信扫描或者点击上方二维码领取Android\Python\AI\Java等高级进阶资源
更多学习资料点击下面的“阅读原文”获取