1.先嘲笑自己一波,每一個activity都寫一個網絡請求,都重複的寫一遍.當adapter裡面需要調用activity的方法時,居然把context改成了activity的名稱,然後adapter就不适用其他的activity了.一直想把請求封裝出去.然後就沒有然後了.
2.MVP的架構雖然還不是了解的很透徹,但是,有了自己的一個了解形式.最難得的是,通過mvp的學習,知道了用接口的形式來實作異步的回調以及基本的封裝.
3.MCP最最最難能可貴的是,如果你覺得現在的代碼很臃腫,MVC的架構讓你看起來快瘋掉了,那麼,你可以進行局部的MVP改寫封裝,這簡直是沒誰了.這是我覺得最最最好的一點.完全可以不影響你現在的代碼結構,你隻需要把某一小塊兒的内容,用MVP封裝出去即可.
4.物競天擇适者生存.這句話永遠沒錯的.釘㭌鑲嵌,萬物不離其中.
所有的都東西,最基本的概念就是MVC,MVC是基本項,MVP是加分項.你把MVP拆封了,會發現原來,還是MVC架構.
5.簡單的用代碼解釋一下自己的感悟.
(1).MVP的套路
activity–>實作view接口;
activity–>實作接口對應的頁面響應事件;
将view對象傳遞給present;
presentimpl–>present接口;
view對象實作activity内的方法;
presentimpl–>interactor接口;
presentimpl–>實作接口對應的方法,和回調方法;
interactorimpl–>實作interactor接口,并執行回調;
(二)8個步驟:我分别給出8個代碼片;
public interface Mvp_MyInformationActivityView {
void goToRelease();
void goToReleaseFail();
}
public class Mvp_MyInformationActivity extends Activity implements View.OnClickListener, Mvp_MyInformationActivityView {
private PullLoadMoreRecyclerView pullLoadMoreRecyclerView;
private RelativeLayout rl_back;
private RelativeLayout rlRelease;
private Mvp_MyInformationPresent present;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp__my_information);
//初始化id
setViews();
//點選事件
setOnDoclick();
}
//初始化id
private void setViews() {
pullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) findViewById(R.id.pullLoadMoreRecyclerView);
rl_back = (RelativeLayout) findViewById(R.id.rl_back);
rlRelease = (RelativeLayout) findViewById(R.id.rlRelease);
present = new Mvp_MyInformationPresentImp(this);
}
//點選事件
private void setOnDoclick() {
rl_back.setOnClickListener(this);
rlRelease.setOnClickListener(this);
}
//點選事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.rl_back:
finish();
break;
case R.id.rlRelease:
present.hasPermessionStorage(this);
break;
}
}
//去釋出
@Override
public void goToRelease() {
startActivity(new Intent(Mvp_MyInformationActivity.this, ReleaseInformationActivity.class));
}
//沒有權限釋出 提示權限
@Override
public void goToReleaseFail() {
HyfToast.showToast(this, "請允許擷取手機照片");
}
@Override
protected void onDestroy() {
present.onDestroy();
super.onDestroy();
}
}
//activity裡的方法
present = new Mvp_MyInformationPresentImp(this);
//接口類
public interface Mvp_MyInformationPresent {
void hasPermessionStorage(Mvp_MyInformationActivity activity);
void onDestroy();
}
//實作類
public class Mvp_MyInformationPresentImp implements Mvp_MyInformationPresent, Mvp_MyInformationModule.moduleHasPermissionStorage {
private Mvp_MyInformationActivityView view;
private Mvp_MyInformationModule module;
public Mvp_MyInformationPresentImp(Mvp_MyInformationActivityView view) {
this.view = view;
module = new Mvp_MyInformationModuleImp();
}
@Override
public void hasPermessionStorage(Mvp_MyInformationActivity activity) {
module.isRelease(activity, this);
}
@Override
public void onDestroy() {
view = null;
}
//module的回調
@Override
public void moduleToSuccess() {
if (view != null) {
view.goToRelease();
}
}
@Override
public void moduleToFail() {
if (view != null) {
view.goToReleaseFail();
}
}
//module的回調
}
//presentImpl裡的方法
//module的回調
@Override
public void moduleToSuccess() {
if (view != null) {
view.goToRelease();
}
}
@Override
public void moduleToFail() {
if (view != null) {
view.goToReleaseFail();
}
}
//module的回調
//presentImpl裡的實作的接口
public class Mvp_MyInformationPresentImp implements Mvp_MyInformationPresent, Mvp_MyInformationModule.moduleHasPermissionStorage
//present實作的回調方法,也是view的執行方法
//module的回調
@Override
public void moduleToSuccess() {
if (view != null) {
view.goToRelease();
}
}
@Override
public void moduleToFail() {
if (view != null) {
view.goToReleaseFail();
}
}
//module的回調
//interactor接口類
public interface Mvp_MyInformationModule {
interface moduleHasPermissionStorage {
void moduleToSuccess();
void moduleToFail();
}
void isRelease(Mvp_MyInformationActivity activty, moduleHasPermissionStorage module);
}
//實作類
public class Mvp_MyInformationModuleImp implements Mvp_MyInformationModule {
@Override
public void isRelease(Mvp_MyInformationActivity activity, moduleHasPermissionStorage module) {
boolean error = false;
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, );
error = true;
module.moduleToFail();
return;
}
if (!error) {
module.moduleToSuccess();
}
}
}
這一整套的邏輯代碼下來我相信已經非常的清楚了.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TV61EejR1TtxGShZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOxITNwMDN5ATMycDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
重點來了;重點來了;重點來了;
通過結構的異步分裝實作;
我在adapter裡面封裝了請求:
InformationFragment_ListFragment_Recycle_Interactor interactor = new InformationFragment_ListFragment_Recycle_InteractorImpl(context);
interactor.ToHttpPost(list.get(position).get("user_id") + "", new InformationFragment_ListFragment_Recycle_Interactor.ToListener() {
@Override
public void ToSuccess(String message) {
HyfToast.showToast(context, message);
}
});
我僅僅隻用了mvp的interactor和接口就實作了這種方式
//接口類
public interface InformationFragment_ListFragment_Recycle_Interactor {
interface ToListener{
void ToSuccess(String message);
}
void ToHttpPost(String userid , ToListener listener);
}
//實作代碼
public class InformationFragment_ListFragment_Recycle_InteractorImpl implements InformationFragment_ListFragment_Recycle_Interactor {
private Context context;
public InformationFragment_ListFragment_Recycle_InteractorImpl(Context context) {
this.context = context;
}
@Override
public void ToHttpPost(String userid, ToListener listener) {
setFollowID(userid, listener);
}
/**
* 添加關注
*/
private void setFollowID(String str01, ToListener listener) {
String url = StaticIP.BUSINESS_FOLLOW;//請求位址
HashMap<String, String> map = new HashMap<>();
map.put("id", str01);
volley_Post_GETID(url, map, "follow", listener);
}
/*****************************
* Volley請求架構
*******************************/
private void volley_Post_GETID(String url, final HashMap<String, String> map, final String type, final ToListener listener) {
StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(final String arg0) {
//解析請求結果
if (type.equals("follow")) {
setHttpResultFollowID(arg0, listener);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(final VolleyError arg0) {
//volley錯誤狀态碼處理
VolleyErrorClass volleyerrorclass = new VolleyErrorClass(context);
volleyerrorclass.setLogCat(arg0);
listener.ToSuccess("關注成功");
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> map01 = new HashMap<>();
map01.put("token", new SystemData(context).getToken(StaticData.Token_Key));
Log.i("haha", "頭資訊" + map01);
return map01;
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> map01;
map01 = map;
return map01;
}
};
request.setRetryPolicy(new DefaultRetryPolicy( * , , f));
request.setTag("abcPost");
YouMaiApplication.getRequestQueue().add(request);
}
/*****************************Volley請求架構*******************************/
/**
* 解析請求結果 關注
*/
protected void setHttpResultFollowID(String str, ToListener listener) {
Log.i("haha", str);
listener.ToSuccess("關注成功");
}
//是以很神奇,我自己都沒想到會誤打誤撞就解決困惑我這麼久的封裝問題,是以所有事情都是事出有因,隻要你多去嘗試新的東西,舊的問題遲早都會因為自己的思想開闊而解決的.真理.
//附上我們上線的應用,大家下載下傳玩一下,有好處的喲!
http://info.appstore.vivo.com.cn/detail/1841175?source=1