MVP模式Demo
MVP(M:model,V:view,P:presenter)
一、先定义三个接口MainModel、MainPresenter、MainView
public interface MainModel { void loadData(String url); interface OnResponse{ void response(String response); } }
public interface MainPresenter { void loadData(String url); MainModel.OnResponse response(); void cancelRequest(); }
public interface MainView { void showProgress(); void hideProgress(); void showMsg(String msg); }二、实现类 MainModeImpl
public class MainModelImpl implements MainModel { private MainPresenterImpl presenter; private StringRequest request; public MainModelImpl(MainPresenterImpl presenter) { this.presenter = presenter; } @Override public void loadData(String url) { //数据库 //网络 request = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { presenter.response().response(response); } },null); MyApp.getMyApp().getRequestQueue().add(request); } }
实现类MainPresenterImpl
public class MainPresenterImpl implements MainPresenter { private MainView mainView; private MainModel.OnResponse response; private MainModelImpl model; public MainPresenterImpl(MainView mainView, MainModel.OnResponse response) { this.mainView = mainView; this.response = response; model = new MainModelImpl(this); } @Override public void loadData(String url) { model.loadData(url); mainView.showProgress(); } @Override public MainModel.OnResponse response() { mainView.hideProgress(); return response; } @Override public void cancelRequest() { } }
而MainActivity直接实现MainView接口
public class MainActivity extends AppCompatActivity implements MainView, MainModel.OnResponse { private MainPresenterImpl mainPresenter; private ProgressBar progressBar; private ActivityMainBinding activityMainBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); progressBar=activityMainBinding.getProgress(); mainPresenter = new MainPresenterImpl(this,this); } @Override protected void onResume() { super.onResume(); mainPresenter.loadData(AppInterface.NEWS_URL); } @Override public void showProgress() { //progressBar.setVisibility(View.VISIBLE); } @Override public void hideProgress() { //progressBar.setVisibility(View.INVISIBLE); } @Override public void showMsg(String msg) { Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } @Override public void response(String response) { //解析数据 } @Override protected void onDestroy() { super.onDestroy(); mainPresenter.cancelRequest(); }
public class MyApp extends Application { private RequestQueue requestQueue; private static MyApp myApp; @Override public void onCreate() { super.onCreate(); this.myApp = this; //初始化Volley initVolley(); } private void initVolley() { requestQueue = Volley.newRequestQueue(this); } public static MyApp getMyApp() { return myApp; } public RequestQueue getRequestQueue() { return requestQueue; } }
<?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> <variable name="adapter" type="org.cms.mvpqjproject.adapter.NewsAdapter" ></variable> <variable name="onItemClickListener" type="android.widget.AdapterView.OnItemClickListener" ></variable> <variable name="progress" type="android.widget.ProgressBar" ></variable> </data> <FrameLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" tools:context=".ui.MainActivity"> <ListView app:setAdapter="@{adapter}" app:setOnItemClickListener="@{onItemClickListener}" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> <ProgressBar android:id="@+id/activity_main_progressBar" android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" /> </FrameLayout> </layout>