MVP模式
16lz
2021-01-26
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); }}
更多相关文章
- Android(安卓)web界面丝滑进度条
- Android——多线程(AsyncTask封装)
- MPAndroidChart项目实战——MarkerView显示问题解决
- DialogFragment的使用总结
- android 常见面试题(三)
- Android(安卓)NestedScrolling 实战
- 新博andorid 初中级考试评测以及答案-------小林老师出的试卷
- Android文件、内存、SDCard管理常用工具类、方法
- onConfigurationChanged