天天看點

MVP架構引導自己的封裝思想

1.先嘲笑自己一波,每一個activity都寫一個網絡請求,都重複的寫一遍.當adapter裡面需要調用activity的方法時,居然把context改成了activity的名稱,然後adapter就不适用其他的activity了.一直想把請求封裝出去.然後就沒有然後了.

2.MVP的架構雖然還不是了解的很透徹,但是,有了自己的一個了解形式.最難得的是,通過mvp的學習,知道了用接口的形式來實作異步的回調以及基本的封裝.

3.MCP最最最難能可貴的是,如果你覺得現在的代碼很臃腫,MVC的架構讓你看起來快瘋掉了,那麼,你可以進行局部的MVP改寫封裝,這簡直是沒誰了.這是我覺得最最最好的一點.完全可以不影響你現在的代碼結構,你隻需要把某一小塊兒的内容,用MVP封裝出去即可.

4.物競天擇适者生存.這句話永遠沒錯的.釘㭌鑲嵌,萬物不離其中.

所有的都東西,最基本的概念就是MVC,MVC是基本項,MVP是加分項.你把MVP拆封了,會發現原來,還是MVC架構.

5.簡單的用代碼解釋一下自己的感悟.

(1).MVP的套路

activity–>實作view接口;

activity–>實作接口對應的頁面響應事件;

将view對象傳遞給present;

presentimpl–>present接口;

view對象實作activity内的方法;

presentimpl–>interactor接口;

presentimpl–>實作接口對應的方法,和回調方法;

interactorimpl–>實作interactor接口,并執行回調;

(二)8個步驟:我分别給出8個代碼片;

public interface Mvp_MyInformationActivityView {

    void goToRelease();

    void goToReleaseFail();

}
           
public class Mvp_MyInformationActivity extends Activity implements View.OnClickListener, Mvp_MyInformationActivityView {

    private PullLoadMoreRecyclerView pullLoadMoreRecyclerView;
    private RelativeLayout rl_back;
    private RelativeLayout rlRelease;

    private Mvp_MyInformationPresent present;

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

        //初始化id
        setViews();

        //點選事件
        setOnDoclick();


    }

    //初始化id
    private void setViews() {
        pullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) findViewById(R.id.pullLoadMoreRecyclerView);
        rl_back = (RelativeLayout) findViewById(R.id.rl_back);
        rlRelease = (RelativeLayout) findViewById(R.id.rlRelease);

        present = new Mvp_MyInformationPresentImp(this);
    }

    //點選事件
    private void setOnDoclick() {
        rl_back.setOnClickListener(this);
        rlRelease.setOnClickListener(this);
    }


    //點選事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.rl_back:
                finish();
                break;

            case R.id.rlRelease:
                present.hasPermessionStorage(this);
                break;
        }

    }

    //去釋出
    @Override
    public void goToRelease() {
        startActivity(new Intent(Mvp_MyInformationActivity.this, ReleaseInformationActivity.class));
    }

    //沒有權限釋出  提示權限
    @Override
    public void goToReleaseFail() {
        HyfToast.showToast(this, "請允許擷取手機照片");
    }

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


}
           
//activity裡的方法
present = new Mvp_MyInformationPresentImp(this);
           
//接口類
public interface Mvp_MyInformationPresent {

    void hasPermessionStorage(Mvp_MyInformationActivity activity);

    void onDestroy();

}

//實作類
public class Mvp_MyInformationPresentImp implements Mvp_MyInformationPresent, Mvp_MyInformationModule.moduleHasPermissionStorage {

    private Mvp_MyInformationActivityView view;
    private Mvp_MyInformationModule module;

    public Mvp_MyInformationPresentImp(Mvp_MyInformationActivityView view) {
        this.view = view;
        module = new Mvp_MyInformationModuleImp();
    }

    @Override
    public void hasPermessionStorage(Mvp_MyInformationActivity activity) {
        module.isRelease(activity, this);
    }

    @Override
    public void onDestroy() {
        view = null;
    }

    //module的回調
    @Override
    public void moduleToSuccess() {
        if (view != null) {
            view.goToRelease();
        }
    }

    @Override
    public void moduleToFail() {
        if (view != null) {
            view.goToReleaseFail();
        }
    }
    //module的回調


}
           
//presentImpl裡的方法
//module的回調
    @Override
    public void moduleToSuccess() {
        if (view != null) {
            view.goToRelease();
        }
    }

    @Override
    public void moduleToFail() {
        if (view != null) {
            view.goToReleaseFail();
        }
    }
    //module的回調
           
//presentImpl裡的實作的接口
public class Mvp_MyInformationPresentImp implements Mvp_MyInformationPresent, Mvp_MyInformationModule.moduleHasPermissionStorage 
           
//present實作的回調方法,也是view的執行方法
//module的回調
    @Override
    public void moduleToSuccess() {
        if (view != null) {
            view.goToRelease();
        }
    }

    @Override
    public void moduleToFail() {
        if (view != null) {
            view.goToReleaseFail();
        }
    }
    //module的回調
           
//interactor接口類
public interface Mvp_MyInformationModule {

    interface moduleHasPermissionStorage {
        void moduleToSuccess();

        void moduleToFail();
    }

    void isRelease(Mvp_MyInformationActivity activty, moduleHasPermissionStorage module);
}

//實作類
public class Mvp_MyInformationModuleImp implements Mvp_MyInformationModule {


    @Override
    public void isRelease(Mvp_MyInformationActivity activity, moduleHasPermissionStorage module) {

        boolean error = false;
        if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, );
            error = true;
            module.moduleToFail();
            return;
        }

        if (!error) {
            module.moduleToSuccess();
        }
    }


}
           

這一整套的邏輯代碼下來我相信已經非常的清楚了.

MVP架構引導自己的封裝思想

重點來了;重點來了;重點來了;

通過結構的異步分裝實作;

我在adapter裡面封裝了請求:

InformationFragment_ListFragment_Recycle_Interactor interactor = new InformationFragment_ListFragment_Recycle_InteractorImpl(context);
                interactor.ToHttpPost(list.get(position).get("user_id") + "", new InformationFragment_ListFragment_Recycle_Interactor.ToListener() {
                    @Override
                    public void ToSuccess(String message) {
                        HyfToast.showToast(context, message);
                    }
                });
           

我僅僅隻用了mvp的interactor和接口就實作了這種方式

//接口類
public interface InformationFragment_ListFragment_Recycle_Interactor {

    interface ToListener{
        void ToSuccess(String message);
    }

    void ToHttpPost(String userid , ToListener listener);

}

//實作代碼
public class InformationFragment_ListFragment_Recycle_InteractorImpl implements InformationFragment_ListFragment_Recycle_Interactor {

    private Context context;

    public InformationFragment_ListFragment_Recycle_InteractorImpl(Context context) {
        this.context = context;
    }

    @Override
    public void ToHttpPost(String userid, ToListener listener) {
        setFollowID(userid, listener);
    }

    /**
     * 添加關注
     */
    private void setFollowID(String str01, ToListener listener) {

        String url = StaticIP.BUSINESS_FOLLOW;//請求位址
        HashMap<String, String> map = new HashMap<>();
        map.put("id", str01);
        volley_Post_GETID(url, map, "follow", listener);

    }

    /*****************************
     * Volley請求架構
     *******************************/
    private void volley_Post_GETID(String url, final HashMap<String, String> map, final String type, final ToListener listener) {
        StringRequest request = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {

                    @Override
                    public void onResponse(final String arg0) {

                        //解析請求結果
                        if (type.equals("follow")) {
                            setHttpResultFollowID(arg0, listener);
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(final VolleyError arg0) {

                //volley錯誤狀态碼處理
                VolleyErrorClass volleyerrorclass = new VolleyErrorClass(context);
                volleyerrorclass.setLogCat(arg0);

                listener.ToSuccess("關注成功");

            }
        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

                HashMap<String, String> map01 = new HashMap<>();
                map01.put("token", new SystemData(context).getToken(StaticData.Token_Key));

                Log.i("haha", "頭資訊" + map01);

                return map01;
            }

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> map01;
                map01 = map;
                return map01;
            }
        };
        request.setRetryPolicy(new DefaultRetryPolicy( * , , f));
        request.setTag("abcPost");
        YouMaiApplication.getRequestQueue().add(request);


    }
    /*****************************Volley請求架構*******************************/

    /**
     * 解析請求結果  關注
     */
    protected void setHttpResultFollowID(String str, ToListener listener) {
        Log.i("haha", str);

        listener.ToSuccess("關注成功");

    }
           

//是以很神奇,我自己都沒想到會誤打誤撞就解決困惑我這麼久的封裝問題,是以所有事情都是事出有因,隻要你多去嘗試新的東西,舊的問題遲早都會因為自己的思想開闊而解決的.真理.

//附上我們上線的應用,大家下載下傳玩一下,有好處的喲!

http://info.appstore.vivo.com.cn/detail/1841175?source=1