Resumen del marco de MVP de Android

El marco MVP se utiliza en el proyecto de la empresa, aquí hay un resumen, la descripción detallada está en los comentarios del código

En el proyecto, me gusta procesar por función.

Primero muestre el procesamiento en el paquete base

  BaseActivity

public class BaseActivity extends AppCompatActivity {


    /**
     * 1 进行一些Activity的公共处理
     * 2 对Activity的批量管理操作
     * 3 等等其他操作
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);

    }

    //你自己项目中需要进行的一些处理

}



BaseViewActivity

/**
 * 为啥要弄这么一个BaseViewActivity 而不是直接用BaseActivity进行View处理
 * 是为了如果有其他Activity不需要处理View但是又需要BaseActivity中其他相同部分的公共处理
 * 所以就不在BaseActivity中进行处理 而是新加了BaseViewActivity
 *
 * @param <V>
 * @param <T> 此处 T extends BasePresenter
 *            是为了 presenter.setViewReference((V) this);
 *            设置View
 */
public abstract class BaseViewActivity<V, T extends BasePresenter> extends BaseActivity {

    protected T presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_presenter);
        presenter = getPresenter();
        //
        presenter.setViewReference((V) this);

    }

      abstract protected T getPresenter();


    public void destroyView() {
        if (null != presenter) {
            presenter.destroyView();
            presenter = null;
        }

    }

}


BasePresenter

public class BasePresenter<V> {


    protected V view;
    //弱引用 防止Activity非正常退出造成内存泄漏
    private WeakReference<V> viewReference;

    public void setViewReference(V view) {
        viewReference = new WeakReference(view);
    }

    public V getView() {

        if (null != viewReference)
            return viewReference.get();

        return null;

    }

    public void destroyView() {

        if (null != viewReference) {
            viewReference.clear();
            viewReference = null;
        }

    }


}

____________________________linea divisoria_________________________________

paquete de inicio de sesión interior

 

Iniciar sesiónConstruir

public interface LoginConstruct {

    interface LoginView {
        void loginResult(String json);
    }

    abstract class LoginPresenter extends BasePresenter<LoginView> {
        abstract void login(String url, String... args);
    }

}

 

LoginActivity

public class LoginActivity extends
        BaseViewActivity<LoginConstruct.LoginView, LoginConstruct.LoginPresenter>
        implements LoginConstruct.LoginView {

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

    }

    private void initData() {
        //此处模拟数据请求工作
        presenter.login("一些参数", "一些参数");
    }

    @Override
    protected LoginConstruct.LoginPresenter getPresenter() {
        // 设置presenter实例化对象
        return new LoginPresenterImp();
    }

    @Override
    public void loginResult(String json) {
        //结果返进行后续处理
        //...
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //此处没有进行销毁操作
        // 是在BaseViewActivity进行统一处理
    }

}

 

Iniciar sesiónPresenterImp

public class LoginPresenterImp extends LoginConstruct.LoginPresenter {

    @Override
    public void login(String url, String... args) {
        /**
         * 进行网络请求,及收到结果,后续操作
         * 这里我是封装的Retrofit
         */


        Observer loginOB = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                //结果返回 处理结果
                doLoginResult(s);
            }

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

            }

            @Override
            public void onComplete() {

            }
        };
        NetUtils.getData(url, loginOB, args);
    }


    private void doLoginResult(String json) {

        //拿到结果进行你需要的处理
        //我就简单的直接传回View
        if (null != getView())
            getView().loginResult(json);
        
    }
    
}

 

Comparemos y veamos cómo funciona

 

 

 

 

Continuará

Supongo que te gusta

Origin blog.csdn.net/u011288271/article/details/105701305
Recomendado
Clasificación