1. 程式人生 > >MVP(較為深入的一種寫法)

MVP(較為深入的一種寫法)

以登入模組為例

  • bean類的解讀

每一次的介面使用我們都會得到一個包裹著具體物件的Result類,當然這個類的名字自己定義都行.暫且我們定義為Result ,這個類裡面包含著屬性很容易看出code,msg,data物件,data之前的泛型就代表了這個Result類可以重複使用.一定要記得在public class Result之後加上這個泛型.

public class Result<T> {
    int code;
    String msg;
    T data;
    //底下是我們具體每次請求的具體物件
    }

另一個的bean類自然需要data資料的解讀,基本上每個介面對應兩個bean類,只不過外面包裹的那一層類(Result)我們共用.

  • Activity的解讀

首先因為我們是介面回撥所以需要實現實現我們core包下的DataCall裡面的型別直接寫上

public class LoginActivity extends AppCompatActivity implements View.OnClickListener,
        DataCall<User>

接下來new出LoginPresenter(), 括號裡的值就是我們的datacall

LoginPresenter presenter = new LoginPresenter(this);

請求資料

presenter.requestData(mobile, password);

這裡因為上面實現了core包下的介面所以會爆紅實現兩個方法這兩個方法自然是我們core包下 介面DataCall的方法.

 @Override
    public void success(User data) {
       /* Toast.makeText(this,data.getUsername(),Toast.LENGTH_LONG).show();
        SharedPreferences.Editor editor = share.edit();
        editor.putString("user",new Gson().toJson(data));
        editor.commit();
        Intent intent = new Intent(this,HomeActivity.class);
        startActivity(intent);
        finish();*/
    }

    @Override
    public void fail(Result result) {
        Toast.makeText(this,result.getCode()+"   "+result.getMsg(),Toast.LENGTH_LONG).show();
    }

以上就是mvp中v的解讀

  • Presentler的解讀
    Presentler去把Model解析返回的資料進行介面回撥給View
/**
  * //這裡我們直接繼承我們的基礎BasePresenter
 */
public class LoginPresenter extends BasePresenter {
    
    //LoginPresenter
    public LoginPresenter(DataCall dataCall) {
        super(dataCall);
    }

    //去Model得到資料(還是動態傳值,注意引數)
    @Override
    protected Result getData(Object... args) {
       //呼叫Model
        Result result = LoginModel.login((String) args[0],(String) args[1]);//呼叫網路請求獲取資料
        return result;
    }
}
  • Model的解讀
    這個就是用來請求資料的,感覺沒必要太多解釋直接呼叫自己的工具類去拼接介面去請求就好了…
public class LoginModel {

   /* public static Result login(final String mobile, final String pwd){
        String resultString = Utils.postForm("http://www.zhaoapi.cn/user/login",
                new String[]{"mobile","password"},new String[]{mobile,pwd});
 

        Gson gson = new Gson();

        Type type = new TypeToken<Result<User>>() {}.getType();

        Result result= gson.fromJson(resultString,type);

        return result;
    }*/

}
  • core包下的解讀
    (主要放一些介面回撥的資料),這裡抽離了Presentler, 抽離出來了一個BasePresenter
    1.這是我們的基礎Interface,很簡單吧,這個就是我們Activity中實現的那個介面

public interface DataCall<T> {
   //成功返回了物件
    void success(T data);
  //失敗返回了result類
    void fail(Result result);

}

2.這裡因為後續程式碼功能的相似所以我們抽離了我們的Presentler,抽離出來一個基礎的Presentler,我們定義為BasePresenter ,這就是為什麼我們的登陸的LoginPresentler需要繼承我們的BasePresentler…
我們之所以抽離就是為了便於簡寫程式碼,實現程式碼的複用性,大家肯定沒有人願意去敲重複的程式碼,抽離共有的部分實現簡寫…所以這裡我們抽離了自己的Presentler層…

public abstract class BasePresenter {

    /**
     * 介面回撥部分
     */
    DataCall dataCall;

    public BasePresenter(DataCall dataCall){
        this.dataCall = dataCall;
    }

    /**
     * Handler
     * Handler的作用:就是把你Model層解析的東西用來回調給我們的Activity也就是mvp中的view
     */
    Handler mHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //這個結果是執行緒傳遞上來的
            Result result = (Result) msg.obj;

            if (result.getCode()==0){
                //成功回撥物件給Activity
                dataCall.success(result.getData());
            }else{
                //失敗回撥Result給Activity
                dataCall.fail(result);
            }
        }
    };


    /**
     * requestData請求資料的方法(裡面引數的值需要注意)
     * ...這個就代表了動態傳值
     * @param args
     */
    public void requestData(final Object...args){
        new Thread(new Runnable() {
            @Override
            public void run() {
                //用message傳遞
                Message message = mHandler.obtainMessage();
                message.obj = getData(args);
                mHandler.sendMessage(message);

            }
        }).start();
    }

    //抽象方法
    protected abstract Result getData(Object...args);

    //防止記憶體洩漏
    public void unBindCall(){
        this.dataCall = null;
    }
     /**
     *  這個是我們在Activity中的解除本頁面介面的繫結方法...
     * 防止記憶體洩漏使用...當然對應我們上面的unBindCall方法...
     *  @Override
     *     protected void onDestroy() {
     *         super.onDestroy();
     *         presenter.unBindCall();//解除本頁面的介面繫結
     *     }
     */

}

到這裡就基本的介紹完了…