以请求新闻为例:
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方便的接收数据 。