mvp+okgo+butterknife搭建android app架构

       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,见工具类


项目下载地址:

   点击打开链接

最后来个简单的效果图:






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值