mvp架构思路:
1、根据数据结构,写java bean:
public class NewsList implements Serializable {
private int news_id;
private String title;
private String intro;
private String cover;
private String source;
private String datetime;
private int view_num;
private int agree_num;
private int comment_num;
public int getNews_id() {
return news_id;
}
public void setNews_id(int news_id) {
this.news_id = news_id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public String getCover() {
return cover;
}
public void setCover(String cover) {
this.cover = cover;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getDatetime() {
return datetime;
}
public void setDatetime(String datetime) {
this.datetime = datetime;
}
public int getView_num() {
return view_num;
}
public void setView_num(int view_num) {
this.view_num = view_num;
}
public int getAgree_num() {
return agree_num;
}
public void setAgree_num(int agree_num) {
this.agree_num = agree_num;
}
public int getComment_num() {
return comment_num;
}
public void setComment_num(int comment_num) {
this.comment_num = comment_num;
}
@Override
public String toString() {
return "NewsList{" +
"news_id=" + news_id +
", title='" + title + '\'' +
", intro='" + intro + '\'' +
", cover='" + cover + '\'' +
", source='" + source + '\'' +
", datetime='" + datetime + '\'' +
", view_num=" + view_num +
", agree_num=" + agree_num +
", comment_num=" + comment_num +
'}';
}
}
2、根据交互需求,写相应的抽象方法,编写接口类InewsView:
public interface INewsView {
void get_lv_data(List<NewsList> data);
void showLoading();
void hideLoading();
}
3、presenter层基类构建,这里attachView和detachView主要是统一管理view周期:
public abstract class BasePresenter<T>{
protected Reference<T> viewRef; //弱引用,防止内存泄漏
public void attachView(T view){
viewRef=new WeakReference<T>(view);
}
public void detachView(){
if(viewRef!=null){
viewRef.clear();
viewRef=null;
}
}
}
4、activity view层基类构建:
public abstract class BaseActivity<V, T extends BasePresenter<V>> extends AppCompatActivity {
public T presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter = initPresenter();
}
@Override
public void onResume() {
super.onResume();
presenter.attachView((V) this);
}
@Override
public void onDestroy() {
presenter.detachView();
super.onDestroy();
}
// 实例化presenter
public abstract T initPresenter();
}
4、presenter层实例类:
public class NewsPresenter extends BasePresenter<INewsView>{
private static final String TAG = "NewsPresenter";
private INewsView mINewsView;
public NewsPresenter(INewsView newsView) {
mINewsView = newsView;
}
public void load_data(int page) {
mINewsView.showLoading();
try {
HashMap<String, Object> params = new HashMap<>();
params.put("page", 1);
params.put("nonce_str", MD5.getMessageDigest(String.valueOf(System.currentTimeMillis()).getBytes()));
JSONObject jsonObject = new JSONObject(params);
Log.i(TAG, "req:" + jsonObject.toString());
String param = AesUtil.encrypt(jsonObject.toString());
OkGo.post(Constant.GET_NEWSLIST)
.tag(this)
.params("data", param)
.execute(new StringCallback() {
@Override
public void onSuccess(String s, Call call, Response response) {
try {
s = AesUtil.desEncrypt(s);
} catch (Exception e) {
e.printStackTrace();
}
Log.i(TAG, "data:" + s);
Gson gson = new Gson();
Base<List<NewsList>> data = gson.fromJson(s,
new TypeToken<Base<List<NewsList>>>() {
}.getType());
mINewsView.get_lv_data(data.getData());
mINewsView.hideLoading();
}
@Override
public void onError(Call call, Response response, Exception e) {
super.onError(call, response, e);
mINewsView.hideLoading();
Log.i(TAG, "error:" + response.toString());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码中用了okgo 网络访问框架,okgo也就是所谓的model层了塞,框架基于okhttp,强力推荐,地址:https://github.com/jeasonlzy/okhttp-OkGo,关于网络访问的数据采用了Aes双向加解密,确保传输中的数据安全,详情请看工具类
5、View层实现类的编写:
public class OkgoActivity extends BaseActivity<INewsView, NewsPresenter> implements INewsView {
private static final String TAG = "OkgoActivity";
@BindView(R.id.okgo_title)
TitleView okgoTitle;
@BindView(R.id.okgo_text)
TextView okgoText;
@BindView(R.id.progressbar)
ProgressBar progressbar;
@BindView(R.id.activity_si_xin)
RelativeLayout activitySiXin;
@BindView(R.id.okgo_img)
ImageView okgoImg;
private NewsPresenter mPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_okgo);
ButterKnife.bind(this);
get_title();
}
private void get_title() {
okgoTitle.setLeftIcon(R.mipmap.fanhui);
okgoTitle.setCenterText("okgo框架");
okgoTitle.setLeftIvListener(new TitleView.LeftIvClickListener() {
@Override
public void click(View view) {
finish();
}
});
}
@Override
public void onResume() {
super.onResume();
mPresenter.load_data(1);
}
@Override
public NewsPresenter initPresenter() {
mPresenter = new NewsPresenter(OkgoActivity.this); //调用接口的实现
return mPresenter;
}
@Override
public void get_lv_data(List<NewsList> data) {
Log.i(TAG, "data activity:" + data);
okgoText.setText("" + data.get(0).toString());
String url = MD5.geturl(data.get(0).getCover());
Log.i(TAG, "okgo_url:" + url);
//请求图片
ImageUtils.setImage(OkgoActivity.this, okgoImg, url);
}
@Override
public void showLoading() {
progressbar.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
progressbar.setVisibility(View.GONE);
}
@Override
public void onDestroy() {
super.onDestroy();
//Activity销毁时,取消网络请求
OkGo.getInstance().cancelTag(this);
}
}
上述代码采用了butterkife注解,很不错的框架,详情:https://github.com/JakeWharton/butterknife ,所获取的图片为md5值,需要拼接成可用的url,见工具类
项目下载地址:
最后来个简单的效果图: