ブロガーの声明:
追加のリンクおよび著者情報の先頭でこの記事を転載し、予約済みとしてマークしてください。ブロガーによるこの記事 ひげニャー サポートやアドバイスの元の聴衆。
この記事は、最初にこのに登場 ブロガー:ひげニャー | ブログのホームページ:https://blog.csdn.net/smile_running
MVPアーキテクチャシリーズ:
実際の使用で導入されたAndroidのMVPアーキテクチャ()MVPアーキテクチャ
AndroidのMVPアーキテクチャ(2)基本的なフレームワークの設計のBaseMVP MVP
動的プロキシとメモリリーク分析アンドロイドMVP MVPアーキテクチャ(3つ)
AndroidのMVPアーキテクチャ(4)MVPの一般的な構成モデル
AndroidのMVPアーキテクチャ(e)のMVPの依存性注入プレゼンターの複数
MVPパッケージのAndroidのMVPアーキテクチャ(6)をBaseFragment
AndroidのMVPアーキテクチャ(7)コードの重複排除するために、プロキシモードのMVP(終了)
送信元アドレス:
githubのダウンロード:MVPDemo
CSDNダウンロード:MVPDemo
前の記事(Andoid MVPアーキテクチャの実用的なアプリケーションで導入された()MVPソフトウェアアーキテクチャ)、私たちは、私たちの長所と短所とMVCとMVPの間のリンクの表面的な理解を可能にするレベルベースMVP HelloWordのプログラムを構築する方法について説明しそして小さなデモに我々は多くの問題を見つけることができます。このデモによって代表MVPを書き、例えば、重複したコードがあります。以前の記事を読んでいない場合、強く、あなたはオーバー行くことを私は理解できないと思うことがありそうでない場合は、この記事をお勧めします、私は次のコードサンプルを見てみましょう:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
mPresenter = new MainPresenter(this);
mPresenter.handlerData();
}
以上basemvpパッケージの以前のバージョンV1に比べてサブ構造のこのバージョンで見てみましょうが、その後、コードの下で、このパッケージは非常に重要です。
層への私たちのビュー層は、プレゼンターの参照を開催し、それが最初のオブジェクトのP層をインスタンス化する必要があり、その後、それ以外の場合は、NULLポインタ例外が発生します、関連法のP層を呼び出すこと。ビュー層は、P層の必須要件の例が何であるかに関係なく、私たちはとても抽象親クラスのメソッドのこの例では、インスタンス化を防ぐために、実装されていることを忘れているのでここでは新しいMainPresenter()は、具体的な実装クラスは、ありますそのサブクラスは、このように私たちが忘れて避け、抽象メソッドを実装する必要があります。
異なる層プレゼンターは、自然にその実装クラスが違うので、あなたがプレゼンター、ジェネリックを通過している人を引用している人を理解するために、ここで、ジェネリック医薬品の使用を検討すべきであります。明らかに、私たちのIBaseView実装クラスBaseActivityは、IBaseViewインタフェース書き方で、最初のを見て、一般的なパラメータプレゼンターを渡す必要があります:
ビュー層、新IBaseViewインタフェース:
package com.test.mvp.mvpdemo.mvp.v2.basemvp;
import android.content.Context;
public interface IBaseView {
Context getContext();
}
私たちは多かれ少なかれコンテキストでの活動に使用される非常に単純な、コンテキストオブジェクトを取得し、それは単に私たちは、このような手間のMainActivity.thisを渡したいという匿名の内部クラスを避けるために、団結を書くためにここに書き込みます。 。ビュー・アクティビティの層があるので、我々はBaseActivity基本クラスを記述する必要がありますので、それは、基本クラスを抽象クラスとして宣言されているので、そこIBaseViewインターフェースので、我々は、、、その具体的な実装クラスを書いて、合計を考慮する必要があります基本クラスを抽出するための方法が、本明細書で使用されるテンプレートパターン。
ビュー層、BaseActivity新しいベースクラス:
package com.test.mvp.mvpdemo.mvp.v2.basemvp;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public abstract class BaseActivity<P extends IBasePresenter> extends AppCompatActivity implements IBaseView {
protected P mPresenter;
protected abstract void initLayout(@Nullable Bundle savedInstanceState);
protected abstract void initViews();
protected abstract void initData();
protected abstract P setPresenter();
protected <T extends View> T $(@IdRes int viewId) {
return findViewById(viewId);
}
@SuppressWarnings("unchecked")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initLayout(savedInstanceState);
/**
* 实例化和绑定 P 层
*/
mPresenter = setPresenter();
mPresenter.attech(this);
initViews();
initData();
}
@Override
protected void onDestroy() {
super.onDestroy();
/**
* 解绑,避免内存泄漏
*/
mPresenter.detech();
mPresenter = null;
}
@Override
public Context getContext() {
return this;
}
}
上記のコードから、私は、ジェネリックジェネリックと基本的な操作は、Javaの基本である必要があり、私はもっと言うことはありません書いた新しいプレゼンター()実装クラスを置きます。抽象メソッド本明細書setPresenter()新しい新しいプレゼンター(に相当する)、場合サブクラス継承BaseActivityとして、それだけには表示層プレゼンタへの参照を保持するように、ライン上の特定のプレゼンタ()インスタンスを返す必要があります。
この方法のルックpresenter.attech(これは)、オブジェクトがIBaseViewインターフェイスタイプが渡され、このように関連付けを形成する層プレゼンタ表示層への参照は、他のオブジェクトは、メソッドを呼び出すことができます。
ここでは、これはメモリリークが発生することがありよう注意が、onDestoryにP層の参照(とき)をリリースする必要があり、この後、私たちは言います。その後、我々は法IBasePresenterインターフェースを見てみましょう。
プレゼンター層、新IBasePresenterインタフェース:
package com.test.mvp.mvpdemo.mvp.v2.basemvp;
public interface IBasePresenter<V extends IBaseView> {
void attech(V view);
void detech();
}
ここでは、非常に単純である和解のネクタイビュービューを結合操作を行うことです。参照BaseViewを保持するために、当社の実装クラスのニーズというBasePresenterが、次のように特定のコードがあり、一般的なビュー層界面を渡す必要があります。
プレゼンター層BasePresenter新しいベースクラス:
package com.test.mvp.mvpdemo.mvp.v2.basemvp;
public abstract class BasePresenter<V extends IBaseView> implements IBasePresenter {
protected V mView;
@SuppressWarnings("unchecked")
@Override
public void attech(IBaseView view) {
mView = (V) view;
}
@Override
public void detech() {
mView = null;
}
}
パッケージベースクラスの両端が、我々はほとんどBaseMVPを形成することができます。残りはMainActivityとMainPresenterの動作を変更することで、こちらのモデル層は変更されていない特定のビジネス・ロジックを変更する必要はありません。だから、私たちは前にMVPのバージョンをv1のインフラ上でいくつかの簡単な変更をしました。(私の以前の記事を参照してください:Andoid MVPアーキテクチャ(実用的なアプリケーションで導入)MVPソフトウェアアーキテクチャを)
まず第一に、契約タイプで、我々は変更する必要があるところ、このクラスのビジネスロジックを変更する必要はありません、2 IBaseViewとIBasePresenterは、我々はそれを書いたの前にいることを覚えていますか?この時に便利です。コードを見てください:
変更MainContract契約カテゴリー:
package com.test.mvp.mvpdemo.mvp.v2;
import com.test.mvp.mvpdemo.mvp.v2.basemvp.IBasePresenter;
import com.test.mvp.mvpdemo.mvp.v2.basemvp.IBaseView;
import okhttp3.Callback;
/**
* 契约接口,可以很直观的看到 M、V、P 层接口中提供的方法
*/
public interface MainContract {
interface IMainModel {
void requestBaidu(Callback callback);
}
interface IMainView extends IBaseView{
void showDialog();
void succes(String content);
}
interface IMainPresenter extends IBasePresenter {
void handlerData();
}
}
基底クラスのそれぞれのインタフェースを継承するIMainViewとIMainPresenter必要サポートジェネリック医薬品へ。
第二に、MainActivityもはや継承AppCompatActivity、と私たちは書かれている基底クラスを継承するには:BaseActivity、次のようにコードを変更します。
ビュー層、修正MainActivity実装クラス:
package com.test.mvp.mvpdemo.mvp.v2.view;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.widget.TextView;
import android.widget.Toast;
import com.test.mvp.mvpdemo.R;
import com.test.mvp.mvpdemo.mvp.v2.MainContract;
import com.test.mvp.mvpdemo.mvp.v2.basemvp.BaseActivity;
import com.test.mvp.mvpdemo.mvp.v2.presenter.MainPresenter;
/**
* MVP 的写法,Version 2: 使用模板方法模式 + 泛型 封装 mvp 基类
*
* @author 神探丶威威猫
* @blog https://blog.csdn.net/smile_running
* @warning 点个赞哦,评个论哦
*/
public class MainActivity extends BaseActivity<MainContract.IMainPresenter> implements MainContract.IMainView {
private TextView tv;
@Override
protected void initLayout(@Nullable Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
}
@Override
protected void initViews() {
tv = $(R.id.tv);
}
@Override
protected void initData() {
mPresenter.handlerData();
}
@Override
protected MainContract.IMainPresenter setPresenter() {
return new MainPresenter();
}
@Override
public void showDialog() {
ProgressDialog dialog = new ProgressDialog(getContext());
dialog.show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dialog.dismiss();
}
}, 1500);
}
@Override
public void succes(String content) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), "" + content, Toast.LENGTH_SHORT).show();
tv.setText(content);
}
});
}
}
それは簡単、その上にちょうどわずかな修正です。その後、我々は、ビュー層への参照を保持するために、次のようにコードが変更された汎用的なインタフェースを、渡すが必要となり、MainPresenterクラスの実装コードを見て:
プレゼンター層、MainPresenter実装クラスを変更します。
package com.test.mvp.mvpdemo.mvp.v2.presenter;
import android.util.Log;
import com.test.mvp.mvpdemo.mvp.v2.MainContract;
import com.test.mvp.mvpdemo.mvp.v2.basemvp.BasePresenter;
import com.test.mvp.mvpdemo.mvp.v2.basemvp.IBaseView;
import com.test.mvp.mvpdemo.mvp.v2.model.DataModel;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/**
* presenter 层,承担业务逻辑处理,数据源处理等
*/
public class MainPresenter extends BasePresenter<MainContract.IMainView> implements MainContract.IMainPresenter {
private MainContract.IMainModel mModel;
@Override
public void attech(IBaseView view) {
super.attech(view);
mModel = new DataModel();
}
@Override
public void handlerData() {
if (mView != null) {
mView.showDialog();
}
/**
* 发起请求,获得回调数据
*/
mModel.requestBaidu(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String content = response.body().string();
if (mView != null) {
mView.succes(content);
}
}
});
}
@Override
public void detech() {
super.detech();
/**
* 释放内存、关闭网络请求、关闭线程等操作
*/
Log.d("==========", "detech: 解除绑定,释放内存");
}
}
最後に、基本的な枠組みの変更が完了、達成の偉大な感覚ということではありません。で、メモリリークと動的なエージェンシー問題:しかし、その後、このフレームワークはいくつかの問題があるだろう、私は次の記事で、この隠されたものを周りに行きます。
これまでのところ、この記事では、我々は、このようなテンプレートパターン、抽象クラスと抽象メソッドなど、ジェネリック医薬品、継承、インターフェース、など、基本のいくつかを使用している、実際には、仕上げを変更するMVPアーキテクチャの新しいバージョンを入れて使用は、それぞれの基本は、Javaで、簡単にああではありません。あなたがMVP、彼自身の手書き一般的なフレームワークのバージョンに基づいて行うことができるならば、それはあなたが非常によく基本をマスターしていることを意味します。それ以外の場合は、のまたはマルチ精査の精査の書き込み他の誰かが、なぜ書き込みについて考えますか?ように効果的に自分のレベルを向上させます。