package com.example.mvp5_lianxi.mvp;
import com.example.mvp5_lianxi.App.App_intierface;
import com.example.mvp5_lianxi.App.WeatherBean;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;
/**
* Created by Administrator on 2018/1/1.
*/
public class Modl {
//请求头
private static final String BASE_URL = "http://www.weather.com.cn/";
private Call<WeatherBean> weatherBeanCall;
public void request(String cityId, Callback<WeatherBean> callback){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
App_intierface intierface = retrofit.create(App_intierface.class);
weatherBeanCall = intierface.requestWeather(cityId);
//将请求下来的数据放进enqueue
weatherBeanCall.enqueue(callback);
}
//关闭网络请求
public void getwangluo(){
if(weatherBeanCall != null && !weatherBeanCall.isCanceled()){
weatherBeanCall.cancel();
}
}
}
package com.example.mvp5_lianxi.mvp;
import android.os.Handler;
import android.util.Log;
import com.example.mvp5_lianxi.App.WeatherBean;
import com.ljq.mvpframework.presenter.BaseMvpPresenter;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by Administrator on 2018/1/1.
*
*/
public class Presenter2 extends BaseMvpPresenter<Iview>{
private final Modl modl;
//这一步必须这么写,切记
public Presenter2() {
this.modl = new Modl();
}
//调用presenter 如果有参数括号里填写参数,没参数的话什么都不用用写
public void clickRequest(final String cityId){
//显示耗时操作
if(getMvpView() != null){
getMvpView().log();
}
//模拟网络延迟,可以显示出加载中
// Handler耗时操作,可加可不加
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//将modl层解析出来的数据在P层调用
modl.request(cityId, new Callback<WeatherBean>() {
@Override
public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
//成功方法
if(getMvpView() != null){
getMvpView().chenggong(response.body());
}
}
@Override
public void onFailure(Call<WeatherBean> call, Throwable t) {
//失败方法
if(getMvpView() != null){
getMvpView().shibai(Log.getStackTraceString(t));
}
}
});
}
},1000);
}
//解绑
@Override
public void onDestroyPersenter() {
super.onDestroyPersenter();
}
//关闭网络
public void interruptHttp(){
modl.getwangluo();
}
}
View层 V
package com.example.mvp5_lianxi.mvp;
import com.example.mvp5_lianxi.App.WeatherBean;
import com.ljq.mvpframework.view.BaseMvpView;
/**
* Created by Administrator on 2018/1/1.
*/
public interface Iview extends BaseMvpView{
//如果做耗时操作加一个log
void log();
//成功
void chenggong(WeatherBean bean);
//失败
void shibai(String shibai);
}
ManiActivity调用MVP方法
package com.example.mvp5_lianxi;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.mvp5_lianxi.App.WeatherBean;
import com.example.mvp5_lianxi.mvp.Iview;
import com.example.mvp5_lianxi.mvp.Presenter2;
import com.ljq.mvpframework.factory.CreatePresenter;
import com.ljq.mvpframework.view.AbstractMvpAppCompatActivity;
/**
* 1.在AbstractMvpActivity中,绑定View,解绑View这些方法,如果现在再创建一个AbstractMvpFragment或者
* AbstractMvpView、或者是一个AbstractMvpXXX等,那么这些代码全部都要再写一遍,代码冗余,可以抽出去
* <p>
* 2.实现AbstractMvpActivity的实现类中创建Presenter的方法,每个实现类都要写new,这一步父类完全可以帮忙解决
*
* <p>
* 3.如果Activity或者Fragment或者View等V层意外销毁,那么我们的Presenter也没有必要存在了,界面都没有了还
* 要这个有什么用,但是如果又被重启
* 那么我们还需要再恢复Presenter,也就是说让我们的Presenter和View的生命周期同步,这样才算完美
* <p>
* 4.创建Presenter的动作放到使用时再创建,可以稍微优化一下性能问题
* <p>
* 解决问题:
* 1.使用代理模式将绑定和解绑view的操作抽离出来
* 定义绑定解绑
* <p>
* 2.使用工厂模式和注解在上层统一创建Presenter
* <p>
* 3.序列化保存Presenter,销毁Presenter对象,如果View重建反序列化重新获取Presenter
* <p>
* 4.将Presenter的创建过程放入到获取Presenter的方法中,如果存在返回,不存在创建,保证Presenter不会为空
* ,而且这样还可以保证在使用的时候再创建,节省内存资源
*/
//添加presenter层的注解必须写
@CreatePresenter(Presenter2.class)
//实现mvp调用AbstractMvpAppCompatActivity<自己的V层,自己的P层>,再继承自己的P层
public class MainActivity extends AbstractMvpAppCompatActivity<Iview,Presenter2> implements Iview{
private Button bt;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = findViewById(R.id.bt);
tv = findViewById(R.id.tv_text);
//button点击事件
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//调用在P层写的调用方法
getMvpPresenter().clickRequest("101010100");
}
});
}
@Override
public void log() {
tv.setText("请求中,请稍后...");
}
@Override
public void chenggong(WeatherBean bean) {
//成功
tv.setText(bean.getWeatherinfo().toString());
}
@Override
public void shibai(String shibai) {
//失败
tv.setText(shibai);
}
}
Retrofit+rxjava使用方法
Modl层
package com.example.mvp_rxjava.mvp;
import com.example.mvp_rxjava.api.Api_interface;
import com.example.mvp_rxjava.api.Bean;
import com.example.mvp_rxjava.api.Fengzhuang;
import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
/**
* Created by Administrator on 2018/1/3.
*/
public class Modl {
//运用接口回调
public void getmodl(final Presenter.DataBack back){
//封装过的retrofit
Retrofit retrofit = Fengzhuang.getretrofit();
Api_interface anInterface = retrofit.create(Api_interface.class);
Flowable<Bean> flowable = anInterface.getmyAPI_HOU();
//RxJAVA
flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Bean>() {
@Override
public void accept(Bean bean) throws Exception {
//回调数据
back.ok(bean);
}
});
}
}
Presenter层
package com.example.mvp_rxjava.mvp;
import com.example.mvp_rxjava.api.Bean;
import com.ljq.mvpframework.presenter.BaseMvpPresenter;
/**
* Created by Administrator on 2018/1/3.
*/
public class Presenter extends BaseMvpPresenter<Iview>{
private final Modl modl;
//这一步必须这么写,切记
public Presenter() {
this.modl = new Modl();
}
//创建接口回调
public interface DataBack{
//成功方法
void ok(Bean bean);
//失败方法
void no();
}
public void getpresenter(){
//调用接口回调
modl.getmodl(new DataBack() {
@Override
public void ok(Bean bean) {
if (getMvpView() != null){
//成功方法
getMvpView().chenggong(bean);
}
}
@Override
public void no() {
}
});
}
}
view层
package com.example.mvp_rxjava.mvp;
import com.example.mvp_rxjava.api.Bean;
import com.ljq.mvpframework.view.BaseMvpView;
/**
* Created by Administrator on 2018/1/3.
*/
public interface Iview extends BaseMvpView{
void chenggong(Bean bean);
}
Activity
package com.example.mvp_rxjava;
import android.os.Bundle;
import android.util.Log;
import com.example.mvp_rxjava.api.Bean;
import com.example.mvp_rxjava.mvp.Iview;
import com.example.mvp_rxjava.mvp.Presenter;
import com.ljq.mvpframework.factory.CreatePresenter;
import com.ljq.mvpframework.view.AbstractMvpAppCompatActivity;
import io.reactivex.Flowable;
//这行一定要写
@CreatePresenter(Presenter.class)
public class MainActivity extends AbstractMvpAppCompatActivity<Iview,Presenter> implements Iview {
private Flowable<Bean> flowable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用P层
getMvpPresenter().getpresenter();
}
//成功方法
@Override
public void chenggong(Bean bean) {
Log.i("sssssssss233",bean.getData().get(0).getName());
}
@Override
public void shibai(String shibai) {
Log.i("sssssssss2",shibai.toString());
}
}
想调用上面的积类MVP必须下载码云上的依赖库方可调用!切记 → 点击打开下载MVP依赖库链接