欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVP框架

程序员文章站 2024-03-15 18:19:18
...

MVP框架

HttpUtilsCallback:
public interface HttpUtilsCallback {
    void onSuccess(String success);
    void onFail(int errCode, String errMsg);
}
NetUtil:
public class NetUtil implements Callback {
    private final OkHttpClient okHttpClient;
    private HttpUtilsCallback httpUtilsCallback;

    private NetUtil() {
        okHttpClient = new OkHttpClient.Builder().build();
    }
    private static class staticClassLazy{
        private static NetUtil netUtil=new NetUtil();
    }
    public static NetUtil getInstance(){
        return staticClassLazy.netUtil;
    }

    public void doGet(String path,HttpUtilsCallback httpUtilsCallback){
        this.httpUtilsCallback = httpUtilsCallback;

        Request request = new Request.Builder()
                .url(path)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(this);
    }

    public void doPost(String path, HashMap<String,String> map,HttpUtilsCallback httpUtilsCallback){
        this.httpUtilsCallback = httpUtilsCallback;

        FormBody.Builder builder = new FormBody.Builder();

        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            String key = iterator.next();
            String value = map.get(key);
            builder.add(key,value);
        }

        FormBody body = builder.build();

        Request request = new Request.Builder()
                .url(path)
                .post(body)
                .build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(this);
    }

    @Override
    public void onFailure(Call call, IOException e) {

    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String string = response.body().string();
        httpUtilsCallback.onSuccess(string);
    }
}
BasePresenter:
public class BasePresenter<T extends IBaseView> {

    private T t;

    public void attachView(T t){
        this.t=t;
    }

    public T getView(){
        return t;
    }

    public void detachView(){
        t=null;
    }
}
MainPresenter:
public class MainPresenter extends BasePresenter<IMainView>{

    private NetUtil netUtil;

    public MainPresenter() {
        netUtil = NetUtil.getInstance();
    }

    public void getDataFromServer(String path,HashMap<String, String> map) {
        netUtil.doPost(path, map, new HttpUtilsCallback() {
            @Override
            public void onSuccess(String success) {
                getView().onSuccess(success);
            }
            @Override
            public void onFail(int errCode, String errMsg) {

            }
        });
    }
}
BaseActivity:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {
    private MyTitleView parent_title;
    private FrameLayout child_view;
    private P p;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);

        initParentView();

        View view = View.inflate(this, setChildContentView(), null);
        child_view.addView(view);

        initView();

        p=initPresenter();
        if (p != null) {
            p.attachView(this);
        }else {
            try {
                throw new Exception("少年 prenter 没有设置 请在您的Activity 创建 presenter");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        initData();
    }

    public MyTitleView getParent_title(){
        return parent_title;
    }

    private void initParentView() {
        parent_title = findViewById(R.id.parent_title);
        child_view = findViewById(R.id.child_view);
        parent_title.getBack().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

    public P getPresenter() {
        return p;
    }

    abstract void initView();
    abstract void initData();
    abstract P initPresenter();
    abstract int setChildContentView();
}
MainActivity:
public class MainActivity extends BaseActivity<MainPresenter> implements IMainView{

    @Override
    void initView() {
        
    }

    @Override
    void initData() {

    }

    @Override
    MainPresenter initPresenter() {
        return new MainPresenter();
    }

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

    @Override
    public void onSuccess(String success) {
        
    }

    @Override
    public void onError(String error) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getPresenter().detachView();
    }
}

MyTitleView:
public class MyTitleView extends RelativeLayout implements View.OnClickListener {
    private Context context;
    private TextView textView;
    private ImageView imageView;

    public MyTitleView(Context context) {
        this(context,null);
    }

    public MyTitleView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyTitleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context=context;
        initView(context);
    }

    private void initView(final Context context) {
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.CENTER_IN_PARENT);
        textView = new TextView(context);
        textView.setId(R.id.tv);
        textView.setText("标题");
        textView.setTextSize(20);
        textView.setTextColor(Color.WHITE);
        addView(textView,params);
        textView.setOnClickListener(this);

        LayoutParams params1 = new LayoutParams(100, 100);
        params1.addRule(RelativeLayout.ALIGN_LEFT);
        params1.addRule(RelativeLayout.CENTER_VERTICAL);
        params1.leftMargin=20;
        imageView = new ImageView(context);
        imageView.setId(R.id.img);
        imageView.setImageResource(R.drawable.icon_back);
        addView(imageView,params1);
    }

    public TextView getTitle(){
        return textView;
    }

    public ImageView getBack(){
        return imageView;
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.tv:
                Toast.makeText(context, ""+textView.getText().toString(), Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
IBaseView:
public interface IBaseView { }
IMainView:
public interface IMainView extends IBaseView {
    void onSuccess(String success);
    void onError(String error);
}
activity_base.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.activity.BaseActivity">

    <com.example.test_mvp.view.customview.MyTitleView
        android:id="@+id/parent_title"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/colorAccent"/>

    <FrameLayout
        android:id="@+id/child_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</android.support.constraint.ConstraintLayout>
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.activity.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>