zg3_day2 MVP 框架

先写mylib包

BasePresenter层

public class BasePresenter<V> {
    WeakReference<V> weakReference;
    protected CompositeDisposable disposable=new CompositeDisposable();

    public void attachView(V view)
    {
        if(weakReference==null)
        {
            weakReference=new WeakReference<V>(view);
        }
    }

    public void distach()
    {
        if(weakReference!=null)
        {
            weakReference.clear();
            weakReference=null;
        }
        if(disposable!=null)
        {
            disposable.clear();
            disposable=null;
        }
    }
    public Boolean isAttach()
    {

        return weakReference!=null&&weakReference.get()!=null;
    }
    public V getView()
    {

        if(weakReference!=null&&weakReference.get()!=null)
        {
            return weakReference.get();
        }
        return null;
    }

}

View层baseactivity

public abstract class BaseActivity<V,P extends BasePresenter<V>> extends AppCompatActivity {

    protected P presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        setContentView(bindLayout());
        initView(savedInstanceState);
        initData();
        if(presenter!=null)
        {
            presenter.attachView((V)this);
        }

    }

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

    public abstract int bindLayout();
    public abstract void initView(Bundle savedInstanceState);
    public abstract void initData();

}

view层写BaseFragment

public abstract class BaseFragment<V,P extends BasePresenter<V>> extends Fragment {
    protected P presenter;
    protected View view;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view= inflater.inflate(R.layout.fragment_base, container, false);
        view=inflater.inflate(bindLayout(),null);
        initView(savedInstanceState);
        initData();
        if(presenter!=null)
        {
            presenter.attachView((V)this);
        }

        return view;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        if(presenter!=null)
        {
            presenter.distach();
        }
    }
    public <T extends View> T findViewById(int id)
    {
        return view.findViewById(id);
    }

    public abstract int bindLayout();
    public abstract void initView(Bundle savedInstanceState);
    public abstract void initData();
}

然后进行组件化

快捷组件化

 然后就可以加进去

开始写MVP框架

model层basemodel

public class BaseModel {
    protected Api api;
    public BaseModel()
    {
        api= RetrofitUtils.getInstance().getRetrofit().create(Api.class);
    }
}

接口
interface ILoginModel{//登录注册
    Observable<UrseEntity> login(HashMap<String,String> map);
    Observable<UrseEntity> register(HashMap<String,String> map);

}
interface ILoginPresenter{
    void login(HashMap<String ,String> map);
    void register(HashMap<String,String> map);
}
interface ILoginView{
    void showUser(UrseEntity entity);
    void regUser(UrseEntity entity);
}
interface IMainModel{//解串和轮播图和搜索
    Observable<VideoEntity> video(int page);
    Observable<BanEntity> banner();
    Observable<VideoEntity> search(String name);
}
interface IMainPresenter{
    void video(int page);
    void banner();
    void search(String name);
}
interface IMainView{
    void getVideo(VideoEntity entity);
    void getBanner(BanEntity entity);
    void getSearch(VideoEntity entity);
}

然后写mainmodel写轮播图和列表

public class MainModel extends BaseModel implements IContrat.IMainModel{
    @Override
    public Observable<VideoEntity> video(int page) {
        return api.video(page);
    }

    @Override
    public Observable<BannerEntity> banner() {
        return api.banner();
    }

    @Override
    public Observable<VideoEntity> search(String name) {
        return api.search(name);
    }
}

然后写LogResmodel写登录注册model层

public class LoginModel extends BaseModel implements IContract.ILoginModel{
    @Override
    public Observable<UrseEntity> login(HashMap<String, String> map) {
        return api.login(map);
    }

    @Override
    public Observable<UrseEntity> register(HashMap<String, String> map) {
        return api.regist(map);
    }
}

写presenter层

主页面的presenter

public class MainPresenter extends BasePresenter<IContract.IMainView> implements IContract.IMainPresenter {
    IContract.IMainModel model=new MainModel();
    @Override
    public void video(int page) {
        model.video(page)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<VideoEntity>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        disposable.add(d);
                    }

                    @Override
                    public void onNext(@NonNull VideoEntity entity) {
                        if(isAttach())
                        {
                            getView().getVideo(entity);
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    public void banner() {
        model.banner()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BanEntity>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        disposable.add(d);
                    }

                    @Override
                    public void onNext(@NonNull BanEntity entity) {
                        if(isAttach())
                        {
                            getView().getBanner(entity);
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    public void search(String name) {
        model.search(name)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<VideoEntity>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        disposable.add(d);
                    }

                    @Override
                    public void onNext(@NonNull VideoEntity entity) {
                        if(isAttach())
                        {
                            getView().getSearch(entity);
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

登录注册的presenter层

public class LoginPresenter extends BasePresenter<IContract.ILoginView>implements IContract.ILoginPresenter {

    IContract.ILoginModel model=new LoginModel();
    @Override
    public void login(HashMap<String, String> map) {
        model.login(map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<UrseEntity>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        disposable.add(d);
                        Log.i("Ssssss", "onSubscribe: 222222222");
                    }

                    @Override
                    public void onNext(@NonNull UrseEntity entity) {
                        if(isAttach())
                        {
                            getView().showUser(entity);
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        Log.i("sss", "onError: 22222"+e.getMessage());
                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    public void register(HashMap<String, String> map) {
        model.register(map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<UrseEntity>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        disposable.add(d);
                    }

                    @Override
                    public void onNext(@NonNull UrseEntity entity) {
                        if(isAttach())
                        {
                            getView().regUser(entity);
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

把所有的接口封装起来

public class IConstent {
    public static final String BASE_URL="http://43.143.146.165:7777";
    public static final String REGISTER_URL="user/register";
    public static final String LOGIN_URL="user/login";
    public static final String VIDEO_URL="video/findVideos?&pageSize=10";
    public static final String SEACHER_URL="video/findVideoByName";
    public static final String BANNER_URL="banner/json";

}

写Api接口

public interface Api {
    @POST(IConstent.LOGIN_URL)
    Observable<UrseEntity> login(@QueryMap HashMap<String,String> map);
    @POST(IConstent.REGISTER_URL)
    Observable<UrseEntity> regist(@QueryMap HashMap<String,String> map);
    @GET(IConstent.VIDEO_URL)
    Observable<VideoEntity> video(@Query("currentPage") int page);
    @GET(IConstent.BANNER_URL)
    Observable<BanEntity> banner();
    @GET(IConstent.SEACHER_URL)
    Observable<VideoEntity> search(@Query("keywords") String name);

}

写RetroUtils单例封装

public class RetroUtils {
    OkHttpClient client;
    private RetroUtils()
    {
        client=new OkHttpClient.Builder()
                .readTimeout(5000, TimeUnit.SECONDS)
                .writeTimeout(5000,TimeUnit.SECONDS)
                .connectTimeout(5000,TimeUnit.SECONDS)
                .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request=chain.request().newBuilder().addHeader("sss","1.1.1").build();
                        return chain.proceed(request);
                    }
                })
                .build();
    }
    private static RetroUtils retroUtils=null;
    public static RetroUtils getInstance()
    {
        if(retroUtils==null)
        {
            synchronized (RetroUtils.class)
            {
                if(retroUtils==null)
                {
                    retroUtils=new RetroUtils();
                }
            }
        }
        return retroUtils;
    }
    private Retrofit retrofit;
    public Retrofit getRetrofit(){
        if(retrofit==null)
        {
            retrofit=new Retrofit.Builder()
                    .client(client)
                    .baseUrl(IConstent.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
        }
        return retrofit;
    }

}

登录页面中代码

@Route(path = "/app/MainActivity")
public class MainActivity extends BaseActivity<IContract.ILoginView, LoginPresenter>implements IContract.ILoginView {

    @BindView(R.id.name)
     EditText name;
    @BindView(R.id.pass)
     EditText pass;
    @BindView(R.id.bt)
     Button bt;
    @BindView(R.id.bt1)
     Button bt1;

    @Override
    public void showUser(UrseEntity entity) {
        if(entity!=null&&entity.getErrorCode()==200)
        {

            Log.i("sss", "showUser: +222222");
            Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
            getSharedPreferences("ss",MODE_PRIVATE)
                    .edit()
                    .putBoolean("www",true).commit();
            ARouter.getInstance().build("/app/MainActivity2").navigation();
        }
        else {
            Log.i("sss", "showUser: +22222wwww2");
            Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void regUser(UrseEntity entity) {

    }

    @Override
    public int bindLayout() {
        return R.layout.activity_main;
    }

    @Override
    public void initView(Bundle savedInstanceState) {

        ButterKnife.bind(this);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = name.getText().toString();
                String s1 = pass.getText().toString();
                HashMap<String,String> map=new HashMap<>();
                map.put("username",s);
                map.put("password",s1);
                presenter.login(map);


            }
        });

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ARouter.getInstance().build("/app/RegisterActivity").navigation();
            }
        });

    }

    @Override
    public void initData() {
        presenter=new LoginPresenter();
    }
}

注册页面的代码

@Route(path = "/app/RegisterActivity")
public class RegisterActivity extends BaseActivity<IContract.ILoginView, LoginPresenter> implements IContract.ILoginView {

    private EditText name,pass,pass2;
    private Button bt;
    @Override
    public int bindLayout() {
        return R.layout.activity_register;
    }

    @Override
    public void initView(Bundle savedInstanceState) {
        name=findViewById(R.id.name);
        pass=findViewById(R.id.pass);
        pass2=findViewById(R.id.pass2);
        bt=findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = name.getText().toString();
                String s1 = pass.getText().toString();
                String s2 = pass2.getText().toString();
                HashMap<String,String> map=new HashMap<>();
                map.put("username",s);
                map.put("password",s1);
                map.put("repassword",s2);
                presenter.register(map);
            }
        });
    }

    @Override
    public void initData() {
        presenter=new LoginPresenter();

    }

    @Override
    public void showUser(UrseEntity entity) {

    }

    @Override
    public void regUser(UrseEntity entity) {
        if(entity.getErrorCode()==200)
        {
            Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
            ARouter.getInstance().build("/app/MainActivity").navigation();
        }
        else {
            Toast.makeText(RegisterActivity.this, "注册失败", Toast.LENGTH_SHORT).show();
        }
    }
}

主页面的代码

@Route(path = "/app/MainActivity2")
public class MainActivity2 extends BaseActivity<IContract.IMainView , MainPresenter> implements IContract.IMainView {

    SmartRefreshLayout sm;
    RecyclerView rc;
    Banner ban;
    MyVideoAdp myVideoAdp;
    EditText search;
    List<VideoEntity.DataDTO> list=new ArrayList<>();
    List<String> stringList=new ArrayList<>();
    int page=1;
    String s1;


    @Override
    public void getVideo(VideoEntity entity) {
        if(entity.getCode()==200)
        {
            list.addAll(entity.getData());
            myVideoAdp.notifyDataSetChanged();
        }
    }

    @Override
    public void getBanner(BanEntity entity) {
        if(entity.getErrorCode()==200)
        {
            List<BanEntity.DataDTO> data = entity.getData();
            for (BanEntity.DataDTO datum : data) {
                stringList.add(datum.getImagePath());
            }
            ban.setImages(stringList);
            ban.setImageLoader(new ImageLoader() {
                @Override
                public void displayImage(Context context, Object path, ImageView imageView) {
                    Glide.with(context).load(path).into(imageView);
                }
            });
            ban.start();
        }
    }

    @Override
    public void getSearch(VideoEntity entity) {

        if(entity.getCode()==200&&entity!=null)
        {
            list.clear();
            list.addAll(entity.getData());
            myVideoAdp.notifyDataSetChanged();
        }
    }

    @Override
    public int bindLayout() {
        return R.layout.activity_main2;
    }

    @Override
    public void initView(Bundle savedInstanceState) {
        sm=findViewById(R.id.sm);
        rc=findViewById(R.id.rc);
        ban=findViewById(R.id.ban);
        search=findViewById(R.id.search);

        myVideoAdp=new MyVideoAdp(R.layout.item,list,this);
        rc.setAdapter(myVideoAdp);
        rc.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));

        sm.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() {
            @Override
            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
                page++;
                presenter.video(page);
                sm.finishLoadMore();
            }

            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                page=1;
                list.clear();
                presenter.video(page);
                sm.finishRefresh();
            }
        });

        search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d("sss", "onTextChanged: 11111");
                 s1= search.getText().toString();
                if(s1.isEmpty())
                {
                    list.clear();
                    presenter.video(page);
                }
                else {
                    Log.d("sss", "onTextChanged: 3333");
                    presenter.search(s1);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        myVideoAdp.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull BaseQuickAdapter adapter, @NonNull View view, int position) {

                ARouter.getInstance().build("/app/XxActivity").withObject("sp",list.get(position)).navigation();
            }
        });

    }

    @Override
    public void initData() {
        presenter=new MainPresenter();
        presenter.video(page);
        presenter.banner();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值