依赖:
//XrecyclerView:
compile 'com.jcodecraeer:xrecyclerview:1.5.9'
//RXjava依赖:
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.0.2'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
// -----------retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
// --------------butterknife依赖
implementation 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
//转换器,请求结果转换成Model
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
//配合Rxjava 使用
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
//fresco依赖
implementation 'com.facebook.fresco:fresco:0.12.0'
implementation 'com.facebook.fresco:animated-webp:0.12.0'
implementation 'com.facebook.fresco:webpsupport:0.12.0'
提前说明:fresco需要在application里初始化,要不然报错;
Utils:
public class HttpUtils { private static volatile HttpUtils httpUtils; private final Retrofit retrofit; public final Api api; private HttpUtils() { OkHttpClient httpClient = new OkHttpClient.Builder() .writeTimeout(3000, TimeUnit.MILLISECONDS) .readTimeout(3000, TimeUnit.MILLISECONDS) .build(); retrofit = new Retrofit.Builder() .baseUrl(Contant.BASE_URI) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(httpClient) .build(); api = retrofit.create(Api.class); } public static HttpUtils getinstener(){ if (httpUtils == null){ synchronized (HttpUtils.class){ if (httpUtils == null){ httpUtils = new HttpUtils(); } } } return httpUtils; } public <T> T create(Class<T> tClass){ return retrofit.create(tClass); } }
Api:
public interface Api { @GET("nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=20") Observable<Bean> key(@Query("page") int page); }
Contant:
public class Contant { public static final String BASE_URI = "http://api.tianapi.com/"; }
MVP:
View层:
IView是个空的; public interface IMainView extends IView { void onsuccess(Bean bean); void onerror(Exception e); }
Model层:
public class MainModel { public void MainModel(int page,final Main main) { Observable<Bean> key = HttpUtils.getinstener().api.key(page); key.observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer<Bean>() { @Override public void accept(Bean bean) throws Exception { main.success(bean); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { } }); } public interface Main{ void success(Bean bean); void error(Exception e); } }
Presenter:
抽取basePresenter:
public abstract class BasePresenter<V extends IView> { protected V v; public BasePresenter() { initModel(); } protected abstract void initModel(); public void attach(V v){ this.v = v; } protected void getdata(){ this.v = null; } }
主的presenter:
public class MainPresenter extends BasePresenter<IMainView> implements IView { private MainModel model; @Override protected void initModel() { model = new MainModel(); } public void getdata(int page){ model.MainModel(page,new MainModel.Main() { @Override public void success(Bean bean) { v.onsuccess(bean); } @Override public void error(Exception e) { v.onerror(e); } }); } }
抽取的baseActivity:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IView { protected P presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); ButterKnife.bind(this); initView(); presenter = getProducter(); initAttach(); initData(); initListener(); } private void initListener() {} protected abstract void initData(); private void initAttach() { if (presenter != null){ presenter.attach(this); } } protected abstract P getProducter(); private void initView() {} protected abstract int getLayoutId(); }
主的activity:
public class MainActivity extends BaseActivity<MainPresenter> implements IMainView { @BindView(R.id.recycler_view) XRecyclerView recyclerView; private int page = 1; @Override protected void initData() { presenter.getdata(page); } @Override protected MainPresenter getProducter() { return new MainPresenter(); } @Override protected int getLayoutId() { return R.layout.activity_main; } @Override public void onsuccess(Bean bean) { LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); final MainAdapter mainAdapter = new MainAdapter(MainActivity.this, bean); recyclerView.setAdapter(mainAdapter); recyclerView.setPullRefreshEnabled(true); recyclerView.setLoadingMoreEnabled(true); recyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { page = 1; presenter.getdata(page); recyclerView.refreshComplete(); Toast.makeText(MainActivity.this, "刷新", Toast.LENGTH_SHORT).show(); } @Override public void onLoadMore() { page++; presenter.getdata(page); recyclerView.loadMoreComplete(); Toast.makeText(MainActivity.this, "加载更多", Toast.LENGTH_SHORT).show(); } }); } @Override public void onerror(Exception e) { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // TODO: add setContentView(...) invocation ButterKnife.bind(this); } }