泛型《T》MVP(新)以及Fragment懒加载

Api包下

package com.example.zz2019330.Api;

public class Api {

    public static final String Api="http://172.17.8.100/small/";

    public static final String APIbANNER="commodity/v1/bannerShow";
    public static final String ApisHOW="commodity/v1/commodityList";
}
-------------------------------------------

package com.example.zz2019330.Api;

import java.util.Map;

import okhttp3.ResponseBody;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
import rx.Observable;

public interface ApiService {

    @POST
    Observable<ResponseBody> doPost(@Url String url ,
                                    @QueryMap Map<String ,String> map,
                                    @Header("userId") String userId,
                                    @Header("sessionId")String sessionId);

    @GET
    Observable<ResponseBody> allGet(@Url String url ,
                                    @QueryMap Map<String ,String> map,
                                    @Header("userId") String userId,
                                    @Header("sessionId")String sessionId);

    @GET
    Observable<ResponseBody> dompGet(@Url String url, @QueryMap Map<String,String> params);

    @GET
    Observable<ResponseBody> doGet(@Url String url);
    @DELETE
    Observable<ResponseBody> dodelete(@Url String url ,
                                      @QueryMap Map<String ,String> map,
                                      @Header("userId") String userId,
                                      @Header("sessionId")String sessionId);
    @PUT
    Observable<ResponseBody> doput(@Url String url ,
                                   @QueryMap Map<String ,String> map,
                                   @Header("userId") String userId,
                                   @Header("sessionId")String sessionId);

}

工具类

package com.example.zz2019330.Utils;

import com.example.zz2019330.Api.Api;
import com.example.zz2019330.Api.ApiService;

import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observer;
import rx.Scheduler;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class RetrofitUtils {


    private final ApiService myService;

    private RetrofitUtils(){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        //okhttp
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .writeTimeout(10,TimeUnit.SECONDS)
                .readTimeout(10,TimeUnit.SECONDS)
                .connectTimeout(10,TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(Api.Api)
                .client(okHttpClient)
                .build();
        myService = retrofit.create(ApiService.class);
    }

    public static RetrofitUtils getInstance() {
        return RetrofitHolder.UTIL;
    }
    private static class RetrofitHolder{
        private static final RetrofitUtils UTIL=new RetrofitUtils();
    }

    public RetrofitUtils doGet(String url, HashMap<String, String> map, String userId, String sessionId,HttpListener listener) {
        //注意与 myApiService的HashMap一样否则类型不匹配
        myService.doGet(url).observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(getObserver(listener));
        return RetrofitUtils.getInstance();
    }

    public Observer getObserver(final HttpListener httpListener){
        Observer observer=new Observer<ResponseBody>() {
            @Override
            public void onCompleted() {

            }
            @Override
            public void onError(Throwable e) {
                if (httpListener!=null){
                                                    //失败
                    httpListener.failure(e.getMessage());
                }
            }

            @Override
            public void onNext(ResponseBody responseBody) {
                if (httpListener!=null){
                    try {
                            httpListener.success(responseBody.string());

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        return observer;
    }



    public interface HttpListener{
        void success(String result);
        void failure(String error);
    }
    private HttpListener httpListener;
    public void setHttpListener(HttpListener httpListener){
        this.httpListener=httpListener;
    }

}

契约类

package com.example.zz2019330.Utils;

public interface ContractCallBack <T>{
    void usuccess(T uresult);
    void udefeated(T uerror);
}

Model

package com.example.zz2019330.Model;

import com.example.zz2019330.Utils.ContractCallBack;

import java.util.HashMap;

public interface ModelCallBack {
    void getShowModelData(String url, HashMap<String,String> map, String userId, String sessionId, int type, ContractCallBack utilsCallBack);
}
----------------------------------------------------------------------------------model类
package com.example.zz2019330.Model;


import com.example.zz2019330.Bean.ShowBean;
import com.example.zz2019330.Bean.ZahnshiBean;
import com.example.zz2019330.Utils.ContractCallBack;
import com.example.zz2019330.Utils.RetrofitUtils;
import com.google.gson.Gson;

import java.util.HashMap;

public class Model implements ModelCallBack {
    @Override
    public void getShowModelData(String url, HashMap<String, String> map, String userId, String sessionId, int type, ContractCallBack utilsCallBack) {
        switch (type){
            case 1:
                getData(url,map,utilsCallBack);
                break;
            case 2:
                getShowqData(url,map,utilsCallBack);
                break;
        }
    }

    private void getShowqData(String url, HashMap<String, String> map, final ContractCallBack utilsCallBack) {


        RetrofitUtils.getInstance().doGet(url, null, null, null, new RetrofitUtils.HttpListener() {
            @Override
            public void success(String result) {
                ZahnshiBean zahnshiBean = new Gson().fromJson(result, ZahnshiBean.class);
                utilsCallBack.usuccess(zahnshiBean);
            }

            @Override
            public void failure(String error) {
                utilsCallBack.udefeated(error);
            }
        });


    }

    private void getData(String url, HashMap<String, String> map, final ContractCallBack contractCallBack) {
        RetrofitUtils.getInstance().doGet(url, null, null, null, new RetrofitUtils.HttpListener() {
            @Override
            public void success(String result) {
                ShowBean showBean = new Gson().fromJson(result, ShowBean.class);
                contractCallBack.usuccess(showBean);
            }

            @Override
            public void failure(String error) {
                contractCallBack.udefeated(error);
            }
        });
    }
}


Presenter

package com.example.zz2019330.Presenter;

import java.util.HashMap;

public interface PresenterCallBack {
    void getShowPresenterData(String url, HashMap<String,String> map, String userId, String sessionId, int type);
}
-----------------------------------Presenter类
package com.example.zz2019330.Presenter;

import com.example.zz2019330.Model.Model;
import com.example.zz2019330.Utils.ContractCallBack;
import com.example.zz2019330.View.View;

import java.util.HashMap;

public class Presenter implements PresenterCallBack{
    private Model model;
    private View view;

    public Presenter(View view) {
        model=new Model();
        this.view = view;
    }


    @Override
    public void getShowPresenterData(String url, HashMap<String, String> map, String userId, String sessionId, int type) {

        model.getShowModelData(url, map, userId, sessionId, type, new ContractCallBack() {
            @Override
            public void usuccess(Object uresult) {
                view.onsuess(uresult);
            }

            @Override
            public void udefeated(Object uerror) {
                view.onError(uerror);
            }
        });

    }
}

View

package com.example.zz2019330.View;

public interface View <T>{
    void onsuess(T result);
    void onError(T error);

}

调用

package com.example.zz2019330.Fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.example.zz2019330.Api.Api;
import com.example.zz2019330.BaseFragment;
import com.example.zz2019330.Bean.ShowBean;
import com.example.zz2019330.Bean.ZahnshiBean;
import com.example.zz2019330.MyAdapter;
import com.example.zz2019330.Presenter.Presenter;
import com.example.zz2019330.R;

import java.util.HashMap;
import java.util.List;

public class Fragment01<T> extends BaseFragment implements com.example.zz2019330.View.View<T> {
    private RecyclerView recyclerView;
    private Presenter presenter;

    @Override
    protected int oncreateview() {
        return R.layout.fragment01;
    }
    @Override
    protected void initView(View view) {
        recyclerView = view.findViewById(R.id.recyclerView);
    }
    @Override
    protected void initDate() {

    }

    @Override
    protected void loadData() {
        presenter = new Presenter(this);

        presenter.getShowPresenterData(Api.ApisHOW,null,null,null,2);

        presenter.getShowPresenterData(Api.APIbANNER,null,null,null,1);
    }

    @Override
    public void onsuess(T result) {
        if (result instanceof ShowBean){
            ShowBean showBean= (ShowBean) result;
            List<ShowBean.ResultBean> data = showBean.getResult();
            Log.i("ppp", "onsuess: "+data.size());

        }else if (result instanceof ZahnshiBean){
            ZahnshiBean zahnshiBean= (ZahnshiBean) result;
            ZahnshiBean.ResultBean result1 = zahnshiBean.getResult();
            List<ZahnshiBean.ResultBean.MlssBean.CommodityListBeanXX> commodityList = result1.getMlss().getCommodityList();
            Log.i("iii", "onsuess://"+result1.getMlss()+"=====");

        }
    }

    @Override
    public void onError(T error) {
    }

}

懒加载 Base Fragment 基类

package com.example.zz2019330;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class BaseFragment extends Fragment {

    //Fragment的View加载完毕的标记
    private boolean isViewCreated;
    //Fragment对用户可见的标记
    private boolean isUIVisible;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=View.inflate(getActivity(),oncreateview(),null);

        initView(view);
        initDate();
        return view;
    }


    protected abstract int oncreateview();

    protected abstract void initView(View view);
    protected abstract void initDate();

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        isViewCreated = true;
        lazyLoad();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //isVisibleToUser这个boolean值表示:该Fragment的UI 用户是否可见
        if (isVisibleToUser) {
            isUIVisible = true;
            lazyLoad();
        } else {
            isUIVisible = false;
        }
    }

    private void lazyLoad() {
        //这里进行双重标记判断,是因为setUserVisibleHint会多次回调,并且会在onCreateView执行前回调,必须确保onCreateView加载完毕且页面可见,才加载数据
        if (isViewCreated && isUIVisible) {
            loadData();
            //数据加载完毕,恢复标记,防止重复加载
            isViewCreated = false;
            isUIVisible = false;
            //Log.i("xx","走了");
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        isViewCreated = false;
        isUIVisible = false;
        //Log.i("xx","销毁");
    }
    protected abstract void loadData();


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值