先写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(); } }