本次实现的就是 登录注册,商品列表 ,商品详情 购物车,以及视频ijkplayer的简单实用:
先来看登录注册 : 这里用的网络请求是:Retorfit+Rxjava Mvp的模式
bean类就不用说了 大多都是自动生成的
因为整个模块都是mvp架构和Retorfit+Rxjava组成的所以简单做了个基类,减少代码的复用
Retrofit:的工具类主要实现:
获取拼接接口的共同部分
实现添加拦截器
实现动态代理模式
默认Gson解析
设置支持Rxjava2
public class RetrofitManager { public static final String BASE_URL = "http://120.27.23.105/"; private final Retrofit mRetrofit; public static class SINGLE_HOLDER { public static final RetrofitManager INSTANCE = new RetrofitManager(BASE_URL); } public static RetrofitManager getInstance() { return SINGLE_HOLDER.INSTANCE; } private RetrofitManager(String baseUrl) { mRetrofit = buildRetrofit(); } private OkHttpClient buildOkHttpClient() { return new OkHttpClient.Builder() .connectTimeout(10000, TimeUnit.MILLISECONDS) .build(); } private Retrofit buildRetrofit() { return new Retrofit.Builder() .client(buildOkHttpClient()) .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } public <T> T create(Class<T> clazz) { return mRetrofit.create(clazz); } } 下面是 M V层的父类接口 这里就定义一个空接口即可,为了配合P层的基类public interface Iview { }
public interface Imodel { }重点P层
抽取所操作的共同点public abstract class Ipresenter <T extends Iview>{ protected T view; public Ipresenter(T view) { this.view = view; init(); } protected abstract void init(); }下面的登录注册的模块
bean都是通过接口自动提取的
V层:public interface Login_view extends Iview { void getYs(bean bean); void getNo(Throwable throwable); }M层:public interface Login_model { @GET("user/login?source=android") Observable<bean>setLoginData(@Query("mobile")String mobile,@Query("password")String password); }public class LoginModel implements Imodel { public Observable<bean> setData(String mobile,String password){ Login_model login_model = RetrofitManager.getInstance().create(Login_model.class); return login_model.setLoginData(mobile,password); } }P层:public class LoginPresenter extends Ipresenter<Login_view> { private LoginModel loginModel; public LoginPresenter(Login_view view) { super(view); } @Override protected void init() { loginModel = new LoginModel(); } public void getLoginJs(String mobile,String password){ Observable<bean> beanObservable = loginModel.setData(mobile, password); beanObservable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<bean>() { @Override public void accept(bean bean) throws Exception { view.getYs(bean); } } , new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { view.getNo(throwable); } } ); } }登录主类:public class MainActivity extends AppCompatActivity implements Login_view { @InjectView(R.id.mobile) EditText mobile; @InjectView(R.id.password) EditText password; @InjectView(R.id.register) TextView register; @InjectView(R.id.login_but) Button loginBut; PlayerView playerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); } @Override public void getYs(bean bean) { Log.e("login", bean.getMsg() ); UidBean uidBean = new UidBean(bean.getData().getUid()); Log.e("login","uid=="+uidBean.getUid()+""); EventBus.getDefault().postSticky(uidBean); startActivity(new Intent(this, Shop_listActivity.class)); } @Override public void getNo(Throwable throwable) { Log.e("login", throwable.getMessage() ); } @OnClick({R.id.register, R.id.login_but}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.register: startActivity(new Intent(MainActivity.this, RegisterActivity.class)); break; case R.id.login_but: mobile.setText("18236019866"); password.setText("123654"); String mobil= mobile.getText().toString(); String pass = password.getText().toString(); LoginPresenter loginPresenter = new LoginPresenter(this); loginPresenter.getLoginJs(mobil,pass); Log.e("login", mobil+"***"+pass ); break; } } }注册:
V层:public interface Reg_View extends Iview{ void getYs(RegisterBean bean); void getNo(Throwable throwable); }M层:public interface Reg_Model { @GET("user/reg?source=android") Observable<RegisterBean> setRegnData(@Query("mobile")String mobile, @Query("password")String password); }public class RegModel implements Imodel { public Observable<RegisterBean> setData(String mobile, String password){ Reg_Model Reg_Model = RetrofitManager.getInstance().create(Reg_Model.class); return Reg_Model.setRegnData(mobile,password); } }P层:public class RegPresenter extends Ipresenter<Reg_View> { private RegModel regModel; public RegPresenter(Reg_View view) { super(view); } @Override protected void init() { regModel = new RegModel(); } public void setRegbeanJs(String mobile,String password){ Observable<RegisterBean> registerBeanObservable = regModel.setData(mobile, password); registerBeanObservable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<RegisterBean>() { @Override public void accept(RegisterBean registerBean) throws Exception { view.getYs(registerBean); } } , new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { view.getNo(throwable); } } ); } }注册的主类代码:public class RegisterActivity extends AppCompatActivity implements Reg_View{ @InjectView(R.id.back) ImageView back; @InjectView(R.id.mobile) EditText mobile; @InjectView(R.id.password) EditText password; @InjectView(R.id.repassword) EditText repassword; @InjectView(R.id.regiser_but) Button regiserBut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); ButterKnife.inject(this); } @OnClick({R.id.back, R.id.regiser_but}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.back: finish(); break; case R.id.regiser_but: String smobile = mobile.getText().toString(); String spass = password.getText().toString(); String repass = repassword.getText().toString(); if (spass.equals(repass)){ RegPresenter regPresenter = new RegPresenter(this); regPresenter.setRegbeanJs(smobile,spass); }else { Toast.makeText(RegisterActivity.this,"两次密码不一致",Toast.LENGTH_LONG).show(); return; } break; } } @Override public void getYs(RegisterBean bean) { Log.e("Register", bean.getMsg() ); if (bean.getCode().equals("0")){ finish(); } } @Override public void getNo(Throwable throwable) { Log.e("Register", throwable.getMessage() ); } }下面是商品分类的:
V层:public interface Shoplist_View extends Iview { void getShopListBean(ShoplistBean bean); }M层:public interface Shoplist_Model { @GET("product/getProducts?pscid=39&source=android") Observable<ShoplistBean>setShoplistData(@Query("page")String page); }public class ShoplistModel implements Imodel { public Observable<ShoplistBean>setShoplistData(String page){ Shoplist_Model shoplist_model = RetrofitManager.getInstance().create(Shoplist_Model.class); return shoplist_model.setShoplistData(page); } }P层:public class ShoplistPresenter extends Ipresenter<Shoplist_View> { private ShoplistModel shoplistModel; public ShoplistPresenter(Shoplist_View view) { super(view); } @Override protected void init() { shoplistModel = new ShoplistModel(); } public void setShoplistData(String page){ Observable<ShoplistBean> shoplistBeanObservable = shoplistModel.setShoplistData(page); shoplistBeanObservable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<ShoplistBean>() { @Override public void accept(ShoplistBean bean) throws Exception { view.getShopListBean(bean); } }); } }适配器:public class ShoplistAdapter extends XRecyclerView.Adapter<ShoplistAdapter.Myhoder> { Context context; List<ShoplistBean.DataBean> list; setOnclickitem onclickitem; public void setOnclickitem(setOnclickitem onclickitem) { this.onclickitem = onclickitem; } public ShoplistAdapter(Context context, List<ShoplistBean.DataBean> list) { this.context = context; this.list = list; } @Override public Myhoder onCreateViewHolder(ViewGroup parent, int viewType) { Fresco.initialize(context); View inflate = View.inflate(context, R.layout.shoplist_item, null); Myhoder myhoder = new Myhoder(inflate); return myhoder; } @Override public void onBindViewHolder(Myhoder holder, final int position) { final ShoplistBean.DataBean dataBean = list.get(position); holder.shoplist_price.setText(dataBean.getBargainPrice()+""); holder.shoplist_title.setText(dataBean.getTitle()+""); Uri parse = Uri.parse(dataBean.getImages().split("!")[0]); holder.shoplist_simp.setImageURI(parse); holder.shoplist_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onclickitem.setitemClick(v,position); } }); } @Override public int getItemCount() { return list.size(); } public interface setOnclickitem{ void setitemClick(View v ,int position); } public class Myhoder extends RecyclerView.ViewHolder { SimpleDraweeView shoplist_simp; TextView shoplist_title,shoplist_price; public Myhoder(View itemView) { super(itemView); shoplist_simp=itemView.findViewById(R.id.shoplist_simp); shoplist_title=itemView.findViewById(R.id.shoplist_title); shoplist_price=itemView.findViewById(R.id.shoplist_price); } } }
商品分类主类代码:public class Shop_listActivity extends AppCompatActivity implements Shoplist_View{ @InjectView(R.id.shoplist_xlv) XRecyclerView shoplistXlv; int page=1; private ShoplistPresenter shoplistPresenter; private ShoplistAdapter shoplistAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop_list); ButterKnife.inject(this); shoplistPresenter = new ShoplistPresenter(this); shoplistPresenter.setShoplistData(page+""); } @Override public void getShopListBean(final ShoplistBean bean) { Log.e("shoplist", bean.getMsg() ); shoplistXlv.setLayoutManager(new LinearLayoutManager(this)); shoplistAdapter = new ShoplistAdapter(Shop_listActivity.this, bean.getData()); if (bean.getData()!=null