效果圖我就不展示了,主要就是把Retrofit+Rxjava+OkHttp封裝在了一起,廢話不多說,甩代碼
請求接口,我使用的是GET
public interface Inters {
/**
* http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
*/
@GET("/nba")
Observable<Bean> getBean(@Query("key") String key,@Query("num") int num);
}
Retrofit+Rxjava+OkHttp封裝
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitUnitl {
private Retrofit mRetrofit;
private String baseUrl;
OkHttpClient client;
private static RetrofitUnitl mRetrofitManager;
private RetrofitUnitl(String baseUrl,OkHttpClient client){
this.baseUrl=baseUrl;
this.client=client;
initRetrofit();
}
public static synchronized RetrofitUnitl getInstance(String baseUrl,OkHttpClient client){
if (mRetrofitManager == null){
mRetrofitManager = new RetrofitUnitl(baseUrl,client);
}
return mRetrofitManager;
}
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
}
public <T> T setCreate(Class<T> reqServer) {
return mRetrofit.create(reqServer);
}
}
下面開始使用MVP請求數據V層
public interface ILogView {
//請求成功
void onSucc(Bean bean);
}
M層
import okhttp3.OkHttpClient;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class LogModel {
ScuMod scuMod;
public void setScuMod(ScuMod scuMod) {
this.scuMod = scuMod;
}
public void Succes(){
//OkHttp裏面可以添加攔截器
OkHttpClient ok = new OkHttpClient.Builder()
.build();
//請求數據
RetrofitUnitl.getInstance("http://api.tianapi.com",ok)
.setCreate(Inters.class)
.getBean("71e58b5b2f930eaf1f937407acde08fe",10)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Bean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Bean bean) {
scuMod.MScus(bean);
}
});
}
//定義一個接口
public interface ScuMod{
void MScus(Bean bean);
}
}
P層
public class LogPresenter implements LogModel.ScuMod {
//弱引用解綁
WeakReference<ILogView> view;
LogModel model;
public LogPresenter( ILogView view) {
attach(view);
model = new LogModel();
model.setScuMod(this);
}
@Override
public void MScus(Bean bean) {
view.get().onSucc(bean);
}
//我們在寫一個方法拿到我們的請求
public void ShowPer(){
model.Succes();
}
//綁定
public void attach(ILogView views){
view = new WeakReference(views);
}
//解綁方法
public void detach(){
view.clear();
}
}
Bean包和適配器我就省略了,直接寫主佈局
public class MainActivity extends AppCompatActivity implements ILogView {
private LogPresenter presenter;
public RecyclerView rv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = findViewById(R.id.rv);
//調用P層
presenter = new LogPresenter(this);
presenter.ShowPer();
}
@Override
public void onSucc(Bean bean) {
//線性佈局
LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
rv.setLayoutManager(manager);
//拿到適配器
MyAdapter adapter = new MyAdapter(MainActivity.this,bean);
rv.setAdapter(adapter);
}
//調用P層的解綁
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detach();
}
}
最後是依賴,不要導錯依賴
compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.facebook.fresco:fresco:1.5.0' compile 'com.android.support:recyclerview-v7:26.1.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'io.reactivex:rxjava:1.1.1' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'