- model:数据层,如从数据库获取数据、或HTTP请求
- view:即UI层:只包含Andorid API的调用
- presenter:展示层,持有view的对象和model的对象,负责把model层获取的数据展示到view层。
画图来展示就是:
以下以一个简易的知乎日报的实现作为实例:
话不多说,直接上代码。
首先是主页布局:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data /> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.py.cheng.nong.xiang.dailyreadjava.ui.MainActivity"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimaryDark" app:titleTextColor="@android:color/white" /> <android.support.v7.widget.RecyclerView android:id="@+id/story_list" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </layout>
接着是Activity:
public class MainActivity extends BaseActivity<ActivityMainBinding> implements MainView { MainPresenter presenter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void loadStoryList(StoryAdapter storyAdapter) { binding.storyList.setAdapter(storyAdapter); } @Override protected int getLayoutId() { return R.layout.activity_main; } @Override protected void initViews() { binding.storyList.setLayoutManager(new LinearLayoutManager(this)); setSupportActionBar(binding.toolbar); } // 向presenter发送请求 @Override protected void initData() { presenter.loadStoryList(); } @Override protected void initPresenter() { presenter = new MainPresenter(this); presenter.attachView(this); } }
presenter:
public class MainPresenter extends BasePresenter<MainView> { private Context context; public MainPresenter(Context context) { this.context = context; } public void loadStoryList() { HttpClient.simpleGet(SharedConstants.MAIN_URL, new HttpClient.CallBack() { @Override public void onSuccess(String data) { Date date = JSON.parseObject(data, Date.class); StoryAdapter adapter = new StoryAdapter(date.getStories()); view.loadStoryList(adapter); } @Override public void onFailure(String msg) { showToast(context, msg); } }); } }
presenter层通过model层获取数据,再通过view对象展示到ui层上
model层的数据获取:
public class HttpClient { public static void simpleGet(String url, CallBack callBack) { new AsyncHttpClient().get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { callBack.onSuccess(new String(responseBody)); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { callBack.onFailure(error.getMessage()); } }); } public interface CallBack { /** * 成功回调 * * @param data data */ void onSuccess(String data); /** * 失败回调 * * @param msg 错误信息 */ void onFailure(String msg); } }
文章来源: Android MVP模式简单实践