清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.com.rikao4_19">
//权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <application android:allowBackup="true" android:name=".App" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
依赖
compile 'com.google.code.gson:gson:2.2.4' compile 'com.squareup.okhttp3:okhttp:3.10.0' // compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.4.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' // 其他依赖 Fresco加载图片框架 compile 'com.facebook.fresco:fresco:0.12.0' compile 'com.facebook.fresco:animated-gif:0.12.0' compile 'org.greenrobot:eventbus:3.0.0'
工具类
public class HttpUtils { //定义单例 private static volatile HttpUtils instance; private final Retrofit retrofit; //无参构造 private HttpUtils(){ //创建一个retrofit对象 String url="https://www.zhaoapi.cn/"; retrofit = new Retrofit.Builder() .baseUrl(url) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static HttpUtils getInstance(){ //判断instance是否为空 if(instance==null){ //为本工具类加同步锁 synchronized (HttpUtils.class){ //再次判断 if(null==instance){ instance=new HttpUtils(); } } } return instance; } //得到apiservice类 public ApiService getApiService(){ //retrofit这个对象使用create方法创建出接口对象, // 通过动态代理,将接口里定义的方法,和传进的值,获取下来,进行数据的请求 return retrofit.create(ApiService.class); } }
APIservice接口
public interface ApiService<T> { //https://www.zhaoapi.cn/product/getProducts?pscid=1 @GET("product/getProducts") Flowable<MeassageBean<List<JavaBean>>> getService(@Query("pscid") String pscid); }初始化fresco
public class App extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
model层
public class DataModel { private final DataPresenter presenter; //提供构造方法 传入p层接口得对象 public DataModel(DataPresenter presenter){ this.presenter=presenter; } //定义请求数据方法 public void getData(String pscid){ //调用工具类得到apiservice,拿到url和参数 ApiService apiService = HttpUtils.getInstance().getApiService(); //调用apiservice方法 Flowable flowable = apiService.getService(pscid); //调用p层请求成功方法 presenter.success(flowable); } }
p层接口
public interface DataPresenter { //定义个成功方法 参数是flowable对象 void success(Flowable<MeassageBean<List<JavaBean>>> flowable); }
p层接口实现类
public class MyDataPresenter implements DataPresenter{ private DataView dataView; //加载视图 public void attachView(DataView dataView){ this.dataView=dataView; } //销毁视图 public void detachView(){ if(dataView!=null){ dataView=null; } } //定义方法调用m层请求数据方法,参数是cid public void getMdata(String pscid){ //创建m层对象 DataModel dataModel=new DataModel(this); dataModel.getData(pscid); } @Override public void success(final Flowable<MeassageBean<List<JavaBean>>> flowable) { //切换线程 flowable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) //回调到主线程 .subscribe(new DisposableSubscriber<MeassageBean<List<JavaBean>>>() { //成功把数据传给v @Override public void onNext(MeassageBean<List<JavaBean>> listMeassageBean) { //调用v请求数据方法 dataView.success(listMeassageBean); } @Override public void onError(Throwable t) { dataView.error(t); } @Override public void onComplete() { } }); } }
v层接口
public interface DataView<T> { //定义成功失败方法 void success(MeassageBean<List<JavaBean>> flowable); void error(Throwable t); }
Mainactivity代码
public class MainActivity extends AppCompatActivity implements DataView<MeassageBean<List<JavaBean>>>{ private MyDataPresenter presenter; private RecyclerView re_view; private List<JavaBean> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 re_view = findViewById(R.id.re_view); //创建p层对象 presenter = new MyDataPresenter(); //加载视图 presenter.attachView(this); presenter.getMdata("1"); } @Override public void success(MeassageBean<List<JavaBean>> flowable) { // Log.d("--", "success: "+flowable.getData().size()); list = flowable.getData(); LinearLayoutManager manager=new LinearLayoutManager(MainActivity.this); re_view.setLayoutManager(manager); //设置适配器 MyAdapter adapter=new MyAdapter(MainActivity.this,list); re_view.setAdapter(adapter); } @Override public void error(Throwable t) { Log.d("----", "error: "+t.getMessage()); } @Override protected void onDestroy() { super.onDestroy(); //判断p对象是否为空 if(presenter!=null){ presenter.detachView(); } } }
MeassageBean类代码
public class MeassageBean<T> { private String msg; private String code; private T data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
Bean类
public class JavaBean { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }