1.base

BaseActivity

public abstract class BaseActivity<V,P extends BasePresenter<V>>extends AppCompatActivity {
protected P mPresenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPresenter=createPresenter();
mPresenter.attachView((V)this);
} /**
* activity/view会持有presenter层的引用,presenter会引用model层的引用。model加载的数据极有可能是网络数据,且极
* 有可能是异步子线程加载的数据。加载这样的数据要耗时,一旦用户点击回退推出了当前的view,则view就被释放了,
* 但是当model层加载数据完成后会回掉监听器,他会拿着view的引用去访问一块已经被释放了的view内存。
* 这样是没有必要的,是浪费资源的,导致了内存的泄漏。
*/
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.detachView();
} public abstract P createPresenter();
}
BasePresenter
public abstract class BasePresenter<V> {

    protected WeakReference<V> mViewRef;//当内存不足时释放内存

    public void attachView(V view){
mViewRef=new WeakReference<V>(view);
} public void detachView(){
if(mViewRef!=null){
mViewRef.clear();
mViewRef=null;
}
} protected V getView(){
return mViewRef.get();
}
}

2.Activity

UserActivity

public class UserActivity extends BaseActivity<UserView,UserPresenter> implements UserView{
private ListView listview;
private UserAdapter mAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview= (ListView) findViewById(R.id.list_view); //入口
mPresenter.fetch();
} @Override
public UserPresenter createPresenter() {
return new UserPresenter();
} @Override
public void showLoading() {
Toast.makeText(getApplicationContext(),"正在加载...",Toast.LENGTH_LONG).show();
} @Override
public void showDatas(List<User> datas) {
mAdapter=new UserAdapter(getApplicationContext(), datas);
listview.setAdapter(mAdapter);
}
}

3.view

UserView

public interface  UserView {

    void showLoading();

    void showDatas(List<User>  datas);
}

4.presenter  

UserPresenter

public class UserPresenter extends BasePresenter<UserView> {

    UserModel userModel=new UserModelImpl();

    public void fetch(){
getView().showLoading();
if(userModel!=null){
userModel.loadDatas(new UserModel.DataOnLoadingListener() {
@Override
public void onComplete(List<User> datas) {
getView().showDatas(datas);
}
});
}
}
}

5.model

UserModel

public interface  UserModel {
void loadDatas(DataOnLoadingListener listener); interface DataOnLoadingListener{
void onComplete(List<User> datas);
}
}
UserModelImpl
public class UserModelImpl implements  UserModel {
@Override
public void loadDatas(DataOnLoadingListener listener) {
List<User> datas= DataUtil.getInstance().getData(); listener.onComplete(datas);
}
}

6.其他的无关的

UserAdapter

public class UserAdapter extends BaseAdapter {
private Context context;
private List<User> datas; public UserAdapter(Context context,List<User>datas){
this.context=context;
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
} @Override
public Object getItem(int position) {
return datas.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(context, R.layout.item, null);
}
ViewHolder holder=ViewHolder.getHolder(convertView);
holder.tv.setText(datas.get(position).getName());
return convertView;
} static class ViewHolder{
TextView tv;
public ViewHolder(View convertView){
tv=(TextView) convertView.findViewById(R.id.textView);
} public static ViewHolder getHolder(View convertView){
ViewHolder holder=(ViewHolder) convertView.getTag();
if(holder==null){
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
return holder;
}
} }

  

User

public class User {
private String name; public User(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

  

DataUtil

public class DataUtil {
private static DataUtil dataUtil=null; public static DataUtil getInstance(){
if(dataUtil==null){
dataUtil=new DataUtil();
}
return dataUtil;
} public List<User> getData(){
List<User> datas = new ArrayList<>();
for (int i = 0; i < 20; i++) {
User user = new User("" + i);
datas.add(user);
}
return datas;
} }

  

  

  

  

https://blog.csdn.net/qq_26907251/article/details/65626087

https://github.com/sunshinewei/ChildrenEduction

MVP模式及性能优化的更多相关文章

  1. Zabbix--06主动模式和被动模式、低级自动发现、性能优化、

    目录 一. Zabbix主动模式和被动模式 1.克隆模版 2.修改克隆后的模版为主动模式 3.修改监控主机关联的模版为主动模式 4.修改客户端配置文件并重启 5.查看最新数据 二.Zabbix低级自动 ...

  2. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  3. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  4. C#中那些[举手之劳]的性能优化

    隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...

  5. 【腾讯Bugly干货分享】Android性能优化典范——第6季

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...

  6. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  7. web性能优化

    常用方法 压缩源码和图片 JavaScript文件源代码:可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG图片可以根据具体质量来压缩为50%到70%,PNG可 以使用一些开源压缩软件来压缩 ...

  8. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  9. 数据库访问性能优化 Oracle

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

随机推荐

  1. python中使用双端队列解决回文问题

    双端队列:英文名字:deque (全名double-ended queue)是一种具有队列和栈性质的抽象数据类型. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 双端队列可以在 ...

  2. iOSAPP开发项目搭建

    架构图: 架构原则:易读性.易维护性.易扩展性. 一.思考 做好一件事,花在思考上的时间应该多于执行. 首先根据产品需求和设计图,脑中先建立一个产品架构: 1. 产品的定位是什么. 社交?媒体?游戏? ...

  3. yarn依赖管理工具,和fis3构建工具 gulp详细用法

    看视频所了解到的,正在进行摸索. 参考:https://www.cnblogs.com/2050/p/4198792.html这篇介绍gulp的文章非常棒,唯一有一点,页面随时刷新的目前还没实现,不知 ...

  4. 对话Task

    上一篇简单讲解了 线程和线程池以及上下文切换.创建线程代价高昂,默认每个线程都要占用大量虚拟内存1M.更有效的做法使用线程池,重复利用线程.在.NET4.0中引入了TPL任务并行库,你可以在将精力集中 ...

  5. underscore.js源码解析【函数】

    // Function (ahem) Functions // ------------------ // Determines whether to execute a function as a ...

  6. SQL 必知必会·笔记<1>了解SQL

    1.1 基本概念 数据库(DataBase) 保存有组织的数据库的容器(通常是一个文件或一组文件). 表(Table) 某种特定数据类型的结构化清单. 模式(Schema) 关于数据库和表的布局及特性 ...

  7. android开发(2):多页面的实现 | Fragment的创建与使用

    APP中出现多个页面再常见不过了.使用activity与fragment都能实现多页面,这里使用fragment来实现.延续“知音”这个APP的开发,之前已经创建了底部导航条与mainactivity ...

  8. spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

    业务需求 首页 实现缓存分页 spring boot 整合redis   (我的是2.0.3版本的) 在pom 文件写上依赖包即可 <dependency><!--依赖包--> ...

  9. lua脚本在游戏中的应用

    为什么要在游戏中使用脚本语言? 要解释这个问题首先我们先来了解一下脚本语言的特性: 学习门槛低,快速上手 开发成本低,可维护性强 动态语言,灵活性高 相对于C/C++这类高复杂性.高风险的编译型语言来 ...

  10. 百度编辑器 UEditor setContent()

    给编辑器赋值的代码: var ue = UE.getEditor('content'); ue.ready(function (){      ue.setContent(data.data.cont ...