前段时间看了几篇MVP在android上的应用,大多数的思路都是一样的。MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,通过Presenter来处理MV之间的关系。但是同样的这么做也会导致很多重复的代码,迭代容易写起来真是恼火不解释。
不喜欢这种设计,但是想法总是要有的,于是我这样做了;
我们通常情况下的一个带有列表的界面(listview,gridview,recyclerview,xxView)但凡是需要从网络加载数据的都有以下几个特点:
1.URL(api地址)
2.Params(参数)
3.回调
我们的Activity往往都只需要接受或者传入这些值来控制
@Override
public String getApiUrl() {
return url;
}
@Override
public RequestParams getParams() {
return params;
}
@Override
public Class getClazz() {
}
@Override
public void Onsuccess(Object o) {
}
@Override
public void Onfailure(String msg) {
T.showShort(this, msg);
}
在Acvtivity中,我只需要这几个方法就可以搞定,开一个BaseListActivity在里边实现网络访问就可以了,之后的activity完全不用管这个list中如何去获取数据的,接受的永远只是一个对象而已。
实例:
public abstract class BaseListActivity<T> extends BaseActivity implements HttpRequstParams<T> {
private RequestQueue mRequestQueue;
private static final String HTTP_TAG = "tag";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRequestQueue = Volley.newRequestQueue(this);
LoadingData();
}
/**
* 获取列表
*/
private void LoadingData() {
StringRequest request = new StringRequest(Request.Method.POST, getApiUrl(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson = new Gson();
T t = (T) gson.fromJson(response,getClazz());
Onsuccess(t);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
Onfailure("获取数据失败");
}
});
request.setRequestParams(getParams());
request.setTag(HTTP_TAG);
mRequestQueue.add(request);
}
/**
* 结束网络访问请求
*/
@Override
protected void onDestroy() {
super.onDestroy();
mRequestQueue.cancelAll(HTTP_TAG);
}
}
public interface HttpRequstParams<T> {
/**
* 获取网络访问的地址
*
* @return
*/
String getApiUrl();
/**
* 获取参数
*
* @return
*/
RequestParams getParams();
/**
* 获取字节码
*
* @return
*/
Class getClazz();
/**
* 成功
**/
void Onsuccess(T t);
/**
* 失败
**/
void Onfailure(String msg);
}
public class TestActivity extends BaseListActivity {
@InjectView(R.id.listView)
ListView listView;
@Override
protected void initLayoutAndView() {
setContentView(R.layout.activity_app_store);
}
@Override
protected void addListener() {
}
@Override
public String getApiUrl() {
return API.APP.APPLIST;
}
@Override
public RequestParams getParams() {
RequestParams params = new RequestParams();
params.addBodyParameter("", "");
.....
return params;
}
@Override
public Class getClazz() {
return xx.class;
}
@Override
public void Onsuccess(Object o) {
}
@Override
public void Onfailure(String msg) {
T.showShort(this, msg);
}
}
这种方式配合快速adapter使用,代码就这么多。轻松加愉快吧!