MVP + Retrofit + RxJava 请求数据

以请求新闻为例:

Model

真正去“搞”事情的类

public abstract class BaseModel {
    private DisposableObserver disposableObserver;

    public DisposableObserver getObserver() {
        return disposableObserver;
    }

    public BaseModel(DisposableObserver observer) {
        this.disposableObserver = observer;
    }

    public abstract Observable getObservable(Retrofit retrofit);
}

Model 类持有一个 observer 和一个 observable 即一个观察者和被观察者,对应的等待数据返回之后的处理者和请求数据者。

public class NewsModel extends BaseModel {

    public NewsModel(DisposableObserver observer) {
        super(observer);
    }

    @Override
    public Observable getObservable(Retrofit retrofit) {
        return retrofit.create(IRequestApi.class).requestNews();
    }
}

View

即视图,对应Activity、Fragment等

public interface IBaseView {
    public void showLoading();

    public void hideLoading();

    public void onError();
}
public interface INewsView extends IBaseView {
    void onNewsSuccess(NewsBean bean);
}

BaseView为各界面统一个接口,NewsView是新闻对应的接口,不多阐述。

Presenter

presenter 准备就绪,就会找到 model 去干“实事”,并观察model是否干完了“实事”。
presenter 拥有view的实例,可随时操纵 view :如显示和隐藏加载中动画,数据返回成功与失败等。

public interface IBasePresenter<T extends IBaseView>  {
    void attach(T t);

    void detach();

    void subscribe(DisposableObserver observer);

    void unsubscribe();
}
public class BasePresenterImpl<T extends IBaseView> implements IBasePresenter<T> {

    protected T view;
    protected CompositeDisposable mCompositeDisposable = new CompositeDisposable();

    @Override
    public void attach(T t) {
        view = t;
    }

    @Override
    public void detach() {
        view = null;
    }

    @Override
    public void subscribe(DisposableObserver observer) {
        if(mCompositeDisposable != null && !mCompositeDisposable.isDisposed()) {
            mCompositeDisposable.add(observer);
        }
    }

    @Override
    public void unsubscribe() {
        if(mCompositeDisposable != null) {
            mCompositeDisposable.clear();
            mCompositeDisposable = null;
        }
    }
}

通过Attach、Detach去让 presenter 绑定 view
CompositeDisposable 是为了防止关闭应用时没有及时处理掉观察者导致的内存泄漏

public class NewsPresenter extends BasePresenterImpl<INewsView> {
    public void requestNews() {
        DisposableObserver observer = new DisposableObserver() {
            @Override
            public void onNext(Object o) {
                view.onNewsSuccess(null);
            }

            @Override
            public void onError(Throwable e) {
                view.onError();
            }

            @Override
            public void onComplete() {

            }
        };

        NewsModel model = new NewsModel(observer);
        RequestManager.getInstance().executeHttpRequest(model);

        subscribe(observer);
    }
}

该方法先定义数据返回之后的处理者也就是观察者,再通过请求管理类去委托 model 做到真正的请求动作。
subscribe 如上述所示,添加到 compositeDisposable,退出时集中处理。

请求管理类

public class RequestManager {

    private Retrofit mRetrofit;
    private OkHttpClient mClient;

    public static RequestManager getInstance() {
        return Instance.instance;
    }

    private RequestManager() {
        init();
    }

    private void init() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(String message) {

            }
        }).setLevel(HttpLoggingInterceptor.Level.BODY);
		
	Interceptor headerInterceptor = new Interceptor() {
   		@Override
   		public Response intercept(Chain chain) throws IOException {
       			Request request = chain.request().newBuilder()
              			.addHeader("Charset", "UTF-8")
              			.addHeader("Content-Type", "application/x-javascript")
          			.addHeader("Accept-Encoding", "gzip,deflate")
            			.addHeader("ckey", "70a7fc95ff2b41dbbe312c269168857f")
           			.build();
       			return chain.proceed(request);
   		}
	};

        mClient = new OkHttpClient.Builder()
        	.addInterceptor(headerInterceptor)
                .addInterceptor(interceptor)
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(60,TimeUnit.SECONDS)
                .build();

        mRetrofit = new Retrofit.Builder()
                .baseUrl("http://www.github.com")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(FastJsonConverterFactory.create())
                .client(mClient)
                .build();
    }

    public void executeHttpRequest(BaseModel model) {
        model.getObservable(mRetrofit)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(model.getObserver());
    }

    private static class Instance {
        static RequestManager instance = new RequestManager();
    }
}

初始化 Retrofit2 框架请求动作,委托 model 进行网络请求。
baseUrl 处是要访问数据的网址。

UI

public abstract class BaseActivity<T extends BasePresenterImpl> extends AppCompatActivity implements IBaseView {

    protected T presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        setPresenter();
        presenter.attach(this);
    }

    protected abstract int getLayoutId();

    protected abstract void setPresenter();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(presenter != null) {
            presenter.detach();
            presenter.unsubscribe();
        }
    }
}

BaseActivity(BaseFragment)实现了 view 且持有 presenter 引用

public class NewsActivity extends BaseActivity<NewsPresenter> implements INewsView {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        presenter.requestNews();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_news;
    }

    @Override
    protected void setPresenter() {
        presenter = new NewsPresenter();
    }

    @Override
    public void onNewsSuccess(NewsBean bean) {

    }

    @Override
    public void showLoading() {
        
    }

    @Override
    public void hideLoading() {

    }

    @Override
    public void onError() {

    }
}

通过 presenter 方便的请求数据,并通过onNewsSucces方便的接收数据 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值