定义
全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。是业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
效果图
请求前* 请求后
Android中使用MVC
- 模型层(Model)
- 视图层(View)
- 控制层(Controller)
详细使用
模型层(Model)
业务模型,建立的数据结构和相关的类,就可以理解为Android的Model,Model是与View无关,而与业务逻辑相关。对数据库的操作、对网络、业务计算等操作等的操作都应该在Model里面处理。
代码如下:
1.先写一个接口
public interface Model {
void getData(String url,ModelListener modelListener);
}
2.继承接口进行数据请求
/**
* Created by Bingsman on 2016/8/2.
*/
public class ModelUrl implements Model {
@Override
public void getData(String url, final ModelListener modelListener) {
OkHttpClient okHttpClient = new OkHttpClient();
// RequestBody requestBody =new FormEncodingBuilder().add().build();
Request request = new Request.Builder().url(url).get().build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
if(response.isSuccessful()){
String json = response.body().string();
if (modelListener != null) {
modelListener.onSuccess(json);
} else {
modelListener.onError();
}
}
}
});
}
}
视图层(View)
使用XML文件进行绘制应用界面,这些XML可以理解为Android的View。而且便于后期界面的修改。如果逻辑与界面对应的id不变化,则代码不用修改,大大增强了代码的可维护性。
这里就是布局文件,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="18dp"
android:text="请求数据" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="18dp"
android:src="@mipmap/ic_launcher"
android:text="无数据" />
</LinearLayout>
控制层(Controller)
Android的控制层的就是Activity。所以尽量不要在Activity中写逻辑,要将业务逻辑通过Activity转接到Model业务逻辑层处理,还有就是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易崩溃。
控制层,代码如下
public class ControllerActivtiy extends Activity {
Model model;
String url = "http://image.baidu.com/channel/listjson?pn=1&rn=1&tag1=美女&tag2=全部&ie=utf8";
private Button button;
private ImageView imageView;
private String imageUrl;
Gson gson;
private Bitmap bitm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
initView();
initData();
}
public void initView() {
button = findView(R.id.button);
imageView = findView(R.id.imageView);
}
public void initData() {
gson = new Gson();
model = new ModelUrl();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
model.getData(url, new ModelListener() {
@Override
void onSuccess(String result) {
super.onSuccess(result);
PictureBean pictureBean = gson.fromJson(result, PictureBean.class);
List<PictureBean.DataBean> list = pictureBean.getData();
if (list != null) {
imageUrl = list.get(0).getImage_url();
bitm = getHttpBitmap(imageUrl);
Message message = new Message();
handler.sendEmptyMessage(0);
}
//得到可用的图片
}
@Override
void onError() {
super.onError();
}
});
}
});
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
imageView.setImageBitmap(bitm);
}
};
/**
* 获取网落图片资源
* @param url
* @return
*/
public static Bitmap getHttpBitmap(String url){
URL myFileURL;
Bitmap bitmap=null;
try{
myFileURL = new URL(url);
//获得连接
HttpURLConnection conn=(HttpURLConnection)myFileURL.openConnection();
//设置超时时间为6000毫秒,conn.setConnectionTiem(0);表示没有时间限制
conn.setConnectTimeout(6000);
//连接设置获得数据流
conn.setDoInput(true);
//不使用缓存
conn.setUseCaches(false);
//这句可有可无,没有影响
//conn.connect();
//得到数据流
InputStream is = conn.getInputStream();
//解析得到图片
bitmap = BitmapFactory.decodeStream(is);
//关闭数据流
is.close();
}catch(Exception e){
e.printStackTrace();
}
return bitmap;
}
protected <T extends View> T findView(int id) {
//return返回view时,加上泛型T
return (T) findViewById(id);
}
}