zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [搬运工系列]-JMeter(十三)压力测试--数据库(mysql)压力测试
    [搬运工系列]-JMeter(十二)处理Cookie与Session
    [搬运工系列]-JMeter(十一)问题与方案--内存溢出解决方法
    [搬运工系列]-JMeter(十) 命令行(非GUI)模式
    [搬运工系列]-JMeter (九)分布式测试
    [搬运工系列]-JMeter(八)HTTP属性管理器HTTP Cookie Manager、HTTP Request Defaults
    Python-Selenium 之控制浏览器的操作,WebDriver常用方法
    Selenium常见的无法定位到元素的原因
    接口测试实战
    jmeter做websocket协议的接口测试
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6066894.html
Copyright © 2011-2022 走看看