MVP相对于MVC,就是让VC之间解耦,就是不让过多的代码和操作放在视图(Activity和Fragment)的生命周期里面,代码看着爽,也减少ANR的概率。


一.来看看安卓源码Launcher部分的MVP模式

1.第一个类HorizontalWorkspace

public class HorizontalWorkspace extends ViewGroup implements OnItemClickListener,OnItemLongClickListener{        //传引用进来1public void setLauncher(Launcher launcher){mLauncher = launcher;}//动态数据监听public interface OnScreenChangeListenerDataLoad {void onScreenChange(int currentIndex);}    //传引用进来2public void setOnScreenChangeListener(OnScreenChangeListener onScreenChangeListener) {this.onScreenChangeListener = onScreenChangeListener;}   使用Launcher引用,调用它实现的方法   onScreenChangeListener.onScreenChange(mCurScreen, mCountScreen);//更新页面指示器   

2.第二个类 LauncherModel

public class LauncherModel extends BroadcastReceiver {    //接口实现类的引用是可以调用 实现类的方法    public interface Callbacks {        public boolean setLoadOnResume();        public void startBinding();        public void finishBindingItems();        public void bindAllApplications(ArrayList apps);        public void bindAppsAdded(ArrayList apps);        public void bindAppsUpdated(ArrayList apps);        public void bindComponentsRemoved(ArrayList packageNames,                        ArrayList appInfos,                        boolean matchPackageNamesOnly);        public void onPageBoundSynchronously(int page);    }    //mCallbacks 就是launcher的引用    public void initialize(Callbacks callbacks) {        synchronized (mLock) {            mCallbacks = new WeakReference(callbacks);        }    }  final Callbacks callbacks = tryGetCallbacks(oldCallbacks);//这里获取了一个引用  final ArrayList added = mBgAllAppsList.added;  mBgAllAppsList.added = new ArrayList();//所以现在 added里边是空的                mHandler.post(new Runnable() {                    public void run() {                        final long t = SystemClock.uptimeMillis();                        if (callbacks != null) {                            if (first) {//获取引用,然后调用接口里面所定义的方法                                callbacks.bindAllApplications(added);                            } else {                                callbacks.bindAppsAdded(added);                            }

3.第三个类 LauncherApplication 帮助LauncherModel初始化的类

//这个Application 子类 是最先运行的public class LauncherApplication extends Application {  mModel = new LauncherModel(this, mIconCache);//新建mode对象    //这里launchmode 初始化Launcher    LauncherModel setLauncher(Launcher launcher) {        mModel.initialize(launcher);;//把Launcher对象传到launcherMode里面        return mModel;    }

4.Launcher类

import com.launcher2.LauncherModel.Callbacks;public class Launcher extends Activity implements HorizontalWorkspace.OnScreenChangeListener, Callbacks{    private LauncherModel mModel;        private HorizontalWorkspace mWorkspace;LauncherApplication app = ((LauncherApplication) getApplication());mModel = app.setLauncher(this);//一。初始化Launcher 并返回launchModemModel.startLoader(true);    mWorkspace = (HorizontalWorkspace) findViewById(R.id.workspace);//1.工作空间mWorkspace.setOnScreenChangeListener(this);//这里传引用进去 HorizontalWorkspacemWorkspace.setLauncher(this);//这里也是if (mOnResumeNeedsLoad) {            mModel.startLoader(true);//开始装载工作空间workspace            mOnResumeNeedsLoad = false;        } //滑屏监听器 ---实现的是HorizontalWorkspace.OnScreenChangeListener里面的方法@Overridepublic void onScreenChange(int currentIndex, int pageCount) {loadPageIndex(currentIndex, pageCount);//这里做的太少了 仅仅是改变了页面指示器}    //-------以下是LauncherModel.Callbacks接口里面的方法@Overridepublic boolean setLoadOnResume() {if (mPaused) {            Log.i(TAG, "setLoadOnResume");            mOnResumeNeedsLoad = true;            return true;        } else {            return false;        }}@Overridepublic void startBinding() {}@Overridepublic void finishBindingItems() {}//都是launchmode调用 ,再到这,然后再去了Workspace @Overridepublic void bindAllApplications(ArrayList apps) {mWorkspace.setApps(apps);}@Overridepublic void bindAppsAdded(ArrayList apps) {mWorkspace.addApps(apps);}@Overridepublic void bindAppsUpdated(ArrayList apps) {mWorkspace.updateApps(apps);}@Overridepublic void bindComponentsRemoved(ArrayList packageNames,ArrayList appInfos, boolean matchPackageNamesOnly) {mWorkspace.removeApps(appInfos);}@Overridepublic void onPageBoundSynchronously(int page) {}

 


二、MVP大概的一个模式

//实现相关类的一个接口public class TabLayoutActivity2 extends AppCompatActivity implements TabLayoutFragment2.mm{    private TabLayoutFragment2 f2;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_tablayout);        initViews();    }    private void initViews() {        TabLayoutFragment2 f2=new TabLayoutFragment2();        f2.setActivity(this);//获取此类的一个引用          fragments.add(f1);            fragments.add(f2);    }    @Override    public void change(String text) {        Toast.makeText(getApplicationContext(),"奥术大师大所:"+text,Toast.LENGTH_SHORT).show();        vp.setCurrentItem(0);    }}

 

public class TabLayoutFragment2 extends Fragment {    TabLayoutActivity2 activity;     //接受传递过来的引用    public void setActivity(TabLayoutActivity2 activity){         this.activity=activity;    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {        View view=(View) inflater.inflate(R.layout.fragment_tb2,null);//          View v=(View) LayoutInflater.from(getActivity()).inflate(R.layout.fragment_tb1,null);        Button btn=view.findViewById(R.id.btn);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                activity.change("asdaiosdhioasd");//利用引用去调用它的方法            }        });        return view;    }    //接口就是定义其实现者要实现哪些方法,然后实现者传回引用到该类,进行调用就行了。    public interface mm{       void  change(String text);    }}

 

更多相关文章

  1. Android(安卓)web界面丝滑进度条
  2. Android——多线程(AsyncTask封装)
  3. MPAndroidChart项目实战——MarkerView显示问题解决
  4. DialogFragment的使用总结
  5. android 常见面试题(三)
  6. Android(安卓)NestedScrolling 实战
  7. 新博andorid 初中级考试评测以及答案-------小林老师出的试卷
  8. Android文件、内存、SDCard管理常用工具类、方法
  9. onConfigurationChanged

随机推荐

  1. Android中文API(136) —— Bitmap
  2. Android(安卓)ImageView 的scaleType属性
  3. Android学习——TextView 设置中划线 下
  4. Port SDL/TinySDGL to android with nati
  5. Android(安卓)Service总结02 service介绍
  6. android merge和include简单使用
  7. 安卓,rebuild apk错误解决
  8. Android(安卓)的提权 (root) 原理是什么?
  9. xml中设置圆角矩形框
  10. Android中Activity启动模式launchermode