Android MVP框架 小結

公司項目中用了MVP框架,這裏進行一點總結,詳細說明都在代碼註釋裏面

項目中我喜歡按功能進行處理

先展示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;
        }

    }


}

____________________________分割線_________________________________

login包裏面

 

LoginConstruct

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進行統一處理
    }

}

 

LoginPresenterImp

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);
        
    }
    
}

 

下面對比看一下是如何操作的

 

 

 

 

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章