MVP模式及性能优化
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模式及性能优化的更多相关文章
- Zabbix--06主动模式和被动模式、低级自动发现、性能优化、
目录 一. Zabbix主动模式和被动模式 1.克隆模版 2.修改克隆后的模版为主动模式 3.修改监控主机关联的模版为主动模式 4.修改客户端配置文件并重启 5.查看最新数据 二.Zabbix低级自动 ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- 【腾讯Bugly干货分享】Android性能优化典范——第6季
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...
- CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化
一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...
- web性能优化
常用方法 压缩源码和图片 JavaScript文件源代码:可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG图片可以根据具体质量来压缩为50%到70%,PNG可 以使用一些开源压缩软件来压缩 ...
- MySQL性能优化总结
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
- 数据库访问性能优化 Oracle
特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...
随机推荐
- webpack打包工具
目的:平时小项目中例如一些网站需要进行打包压缩,用这个工具可以进行打包压缩,就可以上传到服务器. 使用方法: 1,引进需要打包的项目,把入口html替换掉项目中的index.html,把引进的js,c ...
- 机器学习基石笔记:08 Noise and Error
噪声:误标.对同一数据点的标注不一致.数据点信息不准确...... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f------>p(y|x),f是p的 ...
- 机器学习(Machine Learning)算法总结-决策树
一.机器学习基本概念总结 分类(classification):目标标记为类别型的数据(离散型数据)回归(regression):目标标记为连续型数据 有监督学习(supervised learnin ...
- linux中grep/egrep的使用
grep也是linux中查找的一个利器,运维.程序员必掌握的 下面针对grep的参数进行说明: --color 重点标记匹配到项grep "a word" datafile -- ...
- Hive的union和join操作
建表语句: create table tb_in_base ( id bigint, devid bigint, devname string ) partitioned b ...
- .net core Jenkins持续集成Linux、Docker、K8S
jenkins插件 系统管理 -> 管理插件,安装如下插件. #如果搜索不到去掉Plugin在搜索 GitLab Plugin Gitlab Hook Plugin #使用Gitlab账号做用户 ...
- BF算法(模式匹配)
BF算法 (Brute-Force算法) 一种简单的模式匹配算法,目的是寻找模式串p是否在目标串s中有出现. 思想:先从第一个字符开始匹配,如果p[j]==s[i],那么继续向下比较,一旦不相等,即回 ...
- PostgreSQL Json字段作为查询条件案例
业务扩展字段在数据库中经常会使用json格式的数据来存储,这就涉及到一个头疼的问题,假设要使用扩展字段里的某个值作为查询条件怎么办,原来PostgreSQL本身就支持这种查询方式. 例子:假设业务扩展 ...
- CentOS 部署 NodeBB
0x00 前言 NodeBB 是基于 NodeJS 的开源 BBS 系统,可以搭配 redis 或 mongodb 数据库,本文中由于使用 NodeBB 配置中默认的 npm 安装会引起不知原因的 5 ...
- Zabbix4.2.0使用Python连接企业微信报警
目录 1. 配置企业微信 2. 脚本配置 2.1 安装python依赖的库 2.2 编写脚本 2. 搭建FTP 3. 配置Zabbix监控FTP 3.1 添加FTP模板 3.2 添加报警媒介 3.3 ...
