先导依赖
implementation 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.1.6'
implementation 'com.facebook.fresco:fresco:0.14.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.jcodecraeer:xrecyclerview:1.2.0'
implementation 'com.youth.banner:banner:1.4.10'
implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
然后是retrofit工具类
public class RetrofitManager {
private Retrofit mRetrofit;
private String baseUrl;
private static RetrofitManager mRetrofitManager;
public static OkHttpClient okHttpClient;
//静态块,获取OkHttpClient对象
static {
getOkHttpClient();
}
private RetrofitManager(String baseUrl) {
this.baseUrl = baseUrl;
initRetrofit();
}
public static synchronized RetrofitManager getInstance(String baseUrl) {
if (mRetrofitManager == null) {
synchronized (RetrofitManager.class) {
if (mRetrofitManager == null) {
mRetrofitManager = new RetrofitManager(baseUrl);
}
}
}
return mRetrofitManager;
}
//单例模式获取okhttp
public static OkHttpClient getOkHttpClient() {
if (okHttpClient == null) {
synchronized (OkHttpClient.class) {
if (okHttpClient == null) {
okHttpClient = new OkHttpClient.Builder()
//打印拦截器日志
.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
.build();
}
}
}
return okHttpClient;
}
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
}
/**
* 创建相应的服务接口
*/
public T setCreate(Class reqServer) {
return mRetrofit.create(reqServer);
}
}
这是日志拦截器的类 可打印网络信息
public class LogInterceptor implements HttpLoggingInterceptor.Logger {
@Override
public void log(String message) {
Log.e("HttpLogInfo", message);
}
}
接着是地址类Api
public class Api {
public static final String URL="http://www.xieast.com/";
public static final String PATH="http://www.xieast.com/";
}
然后是拼接地址的接口
public interface ApiService {
@GET("api/news/news.php")
Observable getshow();
@GET("api/news/news.php")
Observable getPicture();
}
紧接着就是MVP了
M层 先写一个M层接口IModel 这里面写的是一些方法用来写网络请求的
public interface IModel {
void getData();
void getPicture();
}
然后是实现类UserModel
public class UserModel implements IModel {
OnFinish onFinish;
List lists;
List plist;
public UserModel(OnFinish onFinish) {
this.onFinish=onFinish;
}
public interface OnFinish{
void onFinishListener(List lists);
void onFinishPicture(List plist);
}
@Override
public void getData() {
ApiService apiService = RetrofitManager.getInstance(Api.URL).setCreate(ApiService.class);
Observable getshow = apiService.getshow();
getshow.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(UserBean userBean) {
lists = userBean.getData();
onFinish.onFinishListener(lists);
}
});
}
@Override
public void getPicture() {
ApiService apiService = RetrofitManager.getInstance(Api.PATH).setCreate(ApiService.class);
Observable picture = apiService.getPicture();
picture.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(NewsBean newsBean) {
plist = newsBean.getData();
onFinish.onFinishPicture(plist);
}
});
}
}
P层 这是一个实现类 UserPresenter 连接M层与V层
public class UserPresenter implements UserModel.OnFinish{
IView iView;
UserModel mUserModel;
public UserPresenter(IView iView) {
this.iView=iView;
mUserModel=new UserModel(this);
}
public void setData(){
mUserModel.getData();
mUserModel.getPicture();
}
@Override
public void onFinishListener(List lists) {
iView.success(lists);
}
@Override
public void onFinishPicture(List plist) {
iView.showpicture(plist);
}
}
V层 这是一个接口 IView 里面是P层实现的方法
public interface IView {
void success(List lists);
void showpicture(List plist);
}
接下来就是MainActivity里的方法了
public class MainActivity extends AppCompatActivity implements IView {
@BindView(R.id.xr)
XRecyclerView mXr;
UserPresenter mPresenter = new UserPresenter(this);
@BindView(R.id.xr_picture)
XRecyclerView mXrPicture;
private Madapter ma;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mPresenter.setData();
}
@Override
public void success(List lists) {
ma = new Madapter(this, lists);
mXr.setLayoutManager(new LinearLayoutManager(this));
mXr.setAdapter(ma);
ma.notifyDataSetChanged();
}
@Override
public void showpicture(List plist) {
PictureMadapter pma = new PictureMadapter(this, plist);
mXrPicture.setLayoutManager(new GridLayoutManager(this,3));
mXrPicture.setAdapter(pma);
pma.notifyDataSetChanged();
}
//对接口进行销毁
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null){
mPresenter = null;
}
}
}
Adapter里面
class Madapter extends RecyclerView.Adapter{
List lists;
Context context;
public Madapter(Context context, List lists) {
this.context=context;
this.lists=lists;
}
@NonNull
@Override
public Madapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.item, null);
ViewHolder holder=new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull Madapter.ViewHolder holder, int position) {
holder.fresco.setImageURI(lists.get(position).getThumbnail_pic_s03());
holder.tv.setText(lists.get(position).getTitle());
}
@Override
public int getItemCount() {
return lists.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
SimpleDraweeView fresco;
TextView tv;
public ViewHolder(View itemView) {
super(itemView);
fresco=itemView.findViewById(R.id.fresco);
tv=itemView.findViewById(R.id.tv);
}
}
}