android简洁版MVP模式

上一篇写了MVP模式的例子还是比较多类,后来再简化一下,最终应该是最少类的模式了:
demo布局只有一个按钮,作为Activity跳转测试是否存在内存泄漏,重点的View只在MainActivity

这里借助一个插件MVPHelper,只要你建立一个文件夹名字叫“presenter”,文件夹下建立一个XXPresenter.java,在代码编辑按下alt+insert,选中MvpHelper即可自动生成contract文件夹,和model文件夹,文件夹下会有基本的java文件,并写好了基本的格式代码
工程目录如下:
mvp
是不是很简洁?直接上代码
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还是会回收的。在这些手机上测试内存泄漏看起来是很不准确的,最好找安卓原生系统来测试。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值