android 开发架构,mvp算是比较流行的,最近我也拜读谷歌官方写的代码,先简单的理解他们其中的设计,再去重新实现。
首先谷歌的项目有如下分包特点:
依照模块进行分包。
我个人喜欢按照种类进行分包:
如下是我的分包
其实哪种分包都无所谓,喜欢就行。方便开发是最好的。
于是:先解读google的基础类,BaseView 和 BasePresenter
BaseView谷歌是这么写的(其实就是view的接口,展示view)
public interface BaseView<T> {
void setPresenter(T presenter);
}
将presenter 传值在里面,传值的作用,为了能让开发者使用presenter去操作view。presenter是主要作用于与网络数据沟通,获取model,处理数据一类的。
public interface BasePresenter {
void start();
}
start主要执行一些初始化一类的东西
之后为view和presenter建立契约类
构建出如下契约类
public interface TaskDetailContract {
interface View extends BaseView<Presenter> {
void showTitle(String title);
}
interface Presenter extends BasePresenter {
void editTask();
}
}
为了方便解读,我进行了精简
于是官方将一个fragment作为view,
于是让fragment去实现TaskDetailContract.View接口
public class TaskDetailFragment extends Fragment implements TaskDetailContract.View {
@Override
public void setPresenter(@NonNull TaskDetailContract.Presenter presenter) {
mPresenter = presenter;
}
@Override
public void showTitle(String title) {
mDetailTitle.setVisibility(View.VISIBLE);
mDetailTitle.setText(title);
}
}
我也对官方的demo进行精简,为了方便解读与理解。
当然还有一个最重要的类Presenter,继承了presenter之后,在里面就可以写很多东西了,如网络请求,如处理数据,这样就把android层次分的很清楚了。维护起来也是相当轻松的~
public class TaskDetailPresenter implements TaskDetailContract.Presenter {
@Override
public void start() {
openTask();
}
@Override
public void editTask() {
if (null == mTaskId || mTaskId.isEmpty()) {
mTaskDetailView.showMissingTask();
return;
}
mTaskDetailView.showEditTask(mTaskId);
}
}
在看到这一步的时候 ,有个疑问?官方把fragment作为view的话,activity去干嘛了?
于是查看activity的代码:解读如下
public class TaskDetailActivity extends AppCompatActivity {
public static final String EXTRA_TASK_ID = "TASK_ID";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.taskdetail_act);
// Set up the toolbar.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar ab = getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(true);
ab.setDisplayShowHomeEnabled(true);
// Get the requested task id
String taskId = getIntent().getStringExtra(EXTRA_TASK_ID);
TaskDetailFragment taskDetailFragment = (TaskDetailFragment) getSupportFragmentManager()
.findFragmentById(R.id.contentFrame);
if (taskDetailFragment == null) {
taskDetailFragment = TaskDetailFragment.newInstance(taskId);
ActivityUtils.addFragmentToActivity(getSupportFragmentManager(),
taskDetailFragment, R.id.contentFrame);
}
// Create the presenter
new TaskDetailPresenter(
taskId,
Injection.provideTasksRepository(getApplicationContext()),
taskDetailFragment);
}
}
activity是将view(实际上是fragment)和Presenter创建出来。
activity里并没有多少代码。
如上就是解读,其实简单实现,都在每一步都解释的很清楚了,谢谢观看,如有疑问下面提问~