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. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  2. Xpath定位方法深入探讨及元素定位失败常见情况

    一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...

  3. SQL 必知必会·笔记<14>更新和删除数据

    1. 更新数据 基本的UPDATE语句,由三部分组成: 要更新的表 列名和它们的新值 确定要更新那些行的过滤条件 更新单列示例: UPDATE Customers SET cust_email = ' ...

  4. Netty入门——客户端与服务端通信

    Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...

  5. SpringCloud学习1-服务注册与发现(Eureka)

    由于样式兼容性问题,本文后半部分被截断,可到个人博客找到本文: https://blog.rmiao.top/springcloud-eureka/ 前言 Oracle转让Java,各种动态语言的曝光 ...

  6. leetcode — container-with-most-water

    /** * Source : https://oj.leetcode.com/problems/container-with-most-water/ * * Created by lverpeng o ...

  7. Deep Reinforcement Learning: Pong from Pixels

    这是一篇迟来很久的关于增强学习(Reinforcement Learning, RL)博文.增强学习最近非常火!你一定有所了解,现在的计算机能不但能够被全自动地训练去玩儿ATARI(译注:一种游戏机) ...

  8. CSS hack兼容表

    IE6 IE7 IE8 Firefox Opera Safari !important Y Y Y Y Y _ Y * Y Y *+ Y \9 Y Y Y \0 Y nth-of-type(1) Y ...

  9. jqgrid表头上面再加一行---二级表头

    实现效果如图,代码如下: $( "#table_list_1" ).jqGrid( 'setGroupHeaders' , { useColSpanStyle : true , / ...

  10. InnoDB存储引擎--Innodb Buffer Pool(缓存池)

    InnoDB存储引擎--Innodb Buffer Pool(缓存池) Innodb Buffer Pool的概念 InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面.它是一块 ...