MVP模式及性能优化
2023-09-11 14:20:27 时间
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
相关文章
- 详细讲解提高数据库查询效率的实用方法、外键关于性能
- 关于javascript字符串连接性能
- MERGE INTO 性能问题疑问
- golang语言性能调优
- linux下性能分析命令[总结]
- 蚂蚁金服技术专家对性能优化的常见模式及趋势的思考
- Oracle性能优化学习笔记之WHERE子句中的连接顺序
- 使用事务码 SAT 比较传统的 SELECT SQL 语句和 OPEN / FETCH CURSOR 分块读取 ABAP 数据库表两种方式的性能差异试读版
- Atitit 性能提升总结 流水线模式 FutureTask ForkJoinTask 1.1. 流水线工作方式pipeline1 1.2. FutureTask模式使用异步 流水线 还有多
- Atitit 物化视图与触发器性能测试方法 attilax总结 1.1. 触发器主要影响更新性能。。。1 1.2. 临时打开关闭触发器,如果db不支持可以更改条件使其不触发1 1.3. 打开定时
- 如何确定 Redis 有性能问题和解决方案 —— 筑梦之路
- C++之move提升copy性能(九十四)
- 闪存系统性能优化方向?NAND Cache Program(闪存缓冲编程) 原理与实战?
- mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY'
- 基于电商模式的性能测试(2) —— 使用Jmeter参数化功能+JSR223 PreProcessor+JSON Extractor完成注册登录的数据驱动
- HTTPS、SPDY和HTTP/2的性能比较
- Intel® VTune™ Profiler ——异常检测,没有感觉到惊艳,性能的话还是热点分析更好用,另外microarch 分析可以深入cpu看性能问题
- 利用shell脚本写一个系统性能分析工具
- Web前端性能优化_图层与重绘重排