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数据库描述,对于其它关系型数据库也 ...
随机推荐
- Testing - 软件测试知识梳理 - 探索性测试
定义 探索性测试(Exploratory Testing)是一种自由的软件测试风格,强调测试人员同时展开测试学习,测试设计,测试执行和测试结果评估等活动,以持续优化测试工作. 其特征有:即兴发挥,快速 ...
- iOS-AFN Post JSON格式数据
- (void)postRequest{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // >>> ...
- Python函数——闭包延迟绑定
前言 请看下面代码 def multipliers(): return [lambda x : i*x for i in range(4)] print ([m(2) for m in multipl ...
- 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 0.Practice questions:Recurrent Neural Networks
[解释] It is appropriate when every input should be matched to an output. [解释] in a language model we ...
- 关于vue项目中,手动定义的scrollTop的值
在项目中,有时需要控制scrollTop的值,比如有一个列表页,点击任意一个列表可以进入其详情页,这时如果你要返回的话, 肯定是希望还回到刚刚点击的地方,我当时的解决办法是,本地存下点击那一刻的scr ...
- Djang--module--单表
Django模型层 一 ORM简介 查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装
- Zabbix4.2.0使用Python连接企业微信报警
目录 1. 配置企业微信 2. 脚本配置 2.1 安装python依赖的库 2.2 编写脚本 2. 搭建FTP 3. 配置Zabbix监控FTP 3.1 添加FTP模板 3.2 添加报警媒介 3.3 ...
- [深度学习] 最全优化方法总结比较--SGD,Adagrad,Adadelta,Adam,Adamax,Nadam
SGD 此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 min ...
- 将文件内容隐藏在bmp位图中
首先要实现这个功能,你必须知道bmp位图文件的格式,这里我就不多说了,请看:http://www.cnblogs.com/xiehy/archive/2011/06/07/2074405.html 接 ...
- 完整的一次 HTTP 请求响应过程(二)
上篇文章 我们完整的描述了计算机五层模型中的『应用层』和『运输层』,阐述了较为复杂的 TCP 协议的相关原理,相信大家一定也有所收获,那么本篇将继续五层模型的学习. 网络层 『网络层』其实解决的就是一 ...
