上一篇写了MVP模式的例子还是比较多类,后来再简化一下,最终应该是最少类的模式了:
demo布局只有一个按钮,作为Activity跳转测试是否存在内存泄漏,重点的View只在MainActivity
这里借助一个插件MVPHelper,只要你建立一个文件夹名字叫“presenter”,文件夹下建立一个XXPresenter.java,在代码编辑按下alt+insert,选中MvpHelper即可自动生成contract文件夹,和model文件夹,文件夹下会有基本的java文件,并写好了基本的格式代码
工程目录如下:
是不是很简洁?直接上代码
MainContract.java 这里就是一个总的功能接口,包含了Model数据处理及获取,View界面展示,Presenter业务逻辑处理
public interface MainContract {
interface Model {
void demoModel(ModelListener modelListener);
interface ModelListener{
void completed(String test);
}
}
interface View {
void demoView(String test);
}
interface Presenter {
void demoPresenter();
void register(MainActivity activity);
void unregister();
}
}
MainModel.java 这里实现Model接口的功能
public class MainModel implements MainContract.Model {
@Override
public void demoModel(ModelListener modelListener) {
modelListener.completed("easy MVP 测试");
}
}
MainPresenter.java 这里实现Presenter接口功能,这里需要通过自己写的register()方法传入activity等view,使用弱引用来防止内存泄漏,在自己写的unregister()方法来清理掉弱引用,这两个方法可以在View的生命周期里进行调用
public class MainPresenter implements MainContract.Presenter {
private MainContract.Model model=new MainModel();
private WeakReference<MainActivity>mainActivityWeakReference;
@Override
public void demoPresenter() {
model.demoModel(new MainContract.Model.ModelListener() {
@Override
public void completed(String test) {
mainActivityWeakReference.get().demoView(test);
}
});
}
@Override
public void register(MainActivity activity) {
mainActivityWeakReference=new WeakReference<MainActivity>(activity);
}
@Override
public void unregister() {
mainActivityWeakReference.clear();
}
}
MainActivity.java 这就是View层,在这里实现View接口功能
public class MainActivity extends AppCompatActivity implements MainContract.View {
private MainPresenter mainPresenter;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainPresenter=new MainPresenter();
mainPresenter.register(this);
mainPresenter.demoPresenter();
button=(Button)findViewById(R.id.btn);
Log.e("ysk", "MainActivity onCreate " );
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
finish();
}
});
}
@Override
public void demoView(String test) {
Toast.makeText(this,test,Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
mainPresenter.unregister();
Log.e("ysk", "MainActivity onDestroy " );
}
}
MVP模式到此已经搞定了。当然如果想测内存泄漏与否,就多加一个activity:
public class Main2Activity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Log.e("ysk", "第二个Activity onCreate");
button=(Button)findViewById(R.id.btn2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Main2Activity.this,MainActivity.class);
startActivity(intent);
finish();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("ysk", "第二个Activity onDestroy " );
}
}
多说一句:由于有些手机比如说华为 荣耀,他们的系统底层是经过改写过的,所以可能由于改写了GC回收机制 而导致出现GC没有及时回收掉无用的对象,看似内存泄漏,但其实等到内存不足或者时间过了很久后GC还是会回收的。在这些手机上测试内存泄漏看起来是很不准确的,最好找安卓原生系统来测试。