android荒废有段时间了,空闲之余,突然想复习下之前的知识,同时研究下最近流行的一些框架!首先先复习下架构模式吧!android现在用到的架构模式主要有三种:mvc,mvp,mvvm,先从mvc说起。
1.Model:模型层,负责处理数据的加载或者存储
2.View:视图层,负责界面数据的展示,与用户进行交互
3.Controller:控制器层,负责逻辑业务的处理
在刚学android那会,我们会将activity看做controller,把layout看成view,将网络请求及数据实体类看做Model。随着项目越来越庞大,你会发现activity干的事越来越多,一不留神就几百几千行代码,十分不利维护。其实这个时候,你的activity即干着controller的事,又干着view的事!!我们试着改造下项目:
- 新建个android项目
2.InforBean中存放数据实体
public class InforBean {
String code;
String name;
String age;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
3.Model类使用retrofit请求网络数据
public static void getParm(String url,String id,final onResultCallBack callBack){
// 创建OkHttpClient.Builder对象
OkHttpClient.Builder builder = new OkHttpClient().newBuilder() ;
// 设置拦截器
builder.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
// 设置Header
Request newRequest = chain.request().newBuilder()
.removeHeader("User-Agent")
.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36")
.build() ;
return chain.proceed(newRequest);
}
}) ;
OkHttpClient client = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();
MyService service = retrofit.create(MyService.class);
service.getInfor(id).enqueue(new Callback<InforBean>() {
@Override
public void onResponse(Call<InforBean> call, Response<InforBean> response) {
InforBean inforBean = response.body();
if (inforBean.getCode().equals("200")) {
Log.e("msg", "成功");
callBack.onResult(inforBean.getName()+":"+inforBean.getAge());
} else {
Log.e("msg", "失败");
callBack.onResult("失败");
}
}
@Override
public void onFailure(Call<InforBean> call, Throwable t) {
t.getStackTrace();
System.out.print("baocuo=======:"+t.toString());
Log.e("msg", "连接失败");
callBack.onResult("连接失败");
}
});
}
public interface onResultCallBack {
void onResult(String result);
}
}
4.MyService定义get请求
public interface MyService {
@GET("/test")
Call<InforBean> getInfor(@Query("id") String id);
}
5.main_activity.xml中布局很简单,一个button一个textview
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">
<Button
android:layout_marginTop="20dp"
android:layout_width="200dp"
android:layout_height="50dp"
android:id="@+id/bt"
android:text="点击"
android:background="#fff"
/>
<TextView
android:layout_marginTop="50dp"
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/tv"
/>
</LinearLayout>
下面重点在MainActivity和MyView,我们实现一个小功能,打开app时请求id=1的数据在textview中显示,点击按钮请求id=2的数据更新到textview中,通常情况下我们是这样建立MainActivity:
public class MainActivity extends AppCompatActivity implements Model.onResultCallBack,View.OnClickListener{
String url="http://xxxxx";
TextView tv;
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_avtivity);
tv=(TextView) findViewById(R.id.tv);
bt=(Button)findViewById(R.id.bt);
bt.setOnClickListener(this);
initData();
}
private void initData(){
String id="1";
Model.getParm(url,id,this);
}
@Override
public void onResult(String result) {
tv.setText(result);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt:
String id="2";
Model.getParm(url,id,this);
break;
default:
break;
}
}
}
现在来改造MainActivity,将view相关部分提取到MyView中
public class MyView implements Model.onResultCallBack,View.OnClickListener{
TextView tv;
Button bt;
Activity activity;
MyOnclick callback;
public MyView(Activity activity,MyOnclick callback){
this.activity=activity;
this.callback=callback;
initView(activity);
}
private void initView(Activity activity){
tv=(TextView) activity.findViewById(R.id.tv);
bt=(Button)activity.findViewById(R.id.bt);
bt.setOnClickListener(this);
}
@Override
public void onResult(String result) {
tv.setText(result);
}
@Override
public void onClick(View view) {
callback.MyOnclick(view);
}
public interface MyOnclick{
void MyOnclick(View view);
}
}
新的MainActivity就很简洁了
public class MainActivity extends AppCompatActivity implements MyView.MyOnclick{
MyView myView;
String url="http://xxxxx";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_avtivity);
myView=new MyView(this,this);
initData();
}
private void initData(){
String id="1";
Model.getParm(url,id,myView);
}
@Override
public void MyOnclick(View view) {
String id="2";
Model.getParm(url,id,myView);
}
}
结语:项目改造后更便于理解mvc架构模式,controller,model和,view三者的分工更清晰,有利于后期扩展维护!!
下一篇:Android架构模式——mvp