MVP框架的搭建+Okhttp網路工具類
阿新 • • 發佈:2018-12-21
1View層的介面Iview
package com.example.guoxinyu20181220.view;
public interface Iview<E> {
void requestData(E e);
void requestFail(E e);
}
2.V層實現類(可以是Activity也可以是Fragment)
package com.example.guoxinyu20181220; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.example.guoxinyu20181220.presenter.PresenterImpl; import com.example.guoxinyu20181220.view.Iview; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity implements Iview { private PresenterImpl presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); presenter = new PresenterImpl(this); initView(); initData(); } //請求 網路地址呼叫p層方法 private void initData() { /* Map<String,String> map = new HashMap<>(); map.put("page",String.valueOf(1));*/ //presenter.startRequest("網路介面","map集合chuancan","對應的bean類"); } //初始化view private void initView() { //TODO } @Override public void requestData(Object o) { } @Override public void requestFail(Object o) { } //防止記憶體洩漏呼叫p層的方法 @Override protected void onDestroy() { super.onDestroy(); presenter.onDetach(); } }
3.P層的介面
package com.example.guoxinyu20181220.presenter;
import java.util.Map;
public interface Ipresenter {
void startRequest(String url, Map<String,String> map,Class clazz);
}
4.P層的實現類
package com.example.guoxinyu20181220.presenter; import com.example.guoxinyu20181220.MainActivity; import com.example.guoxinyu20181220.model.ModelImpl; import com.example.guoxinyu20181220.view.Iview; import java.util.Map; public class PresenterImpl implements Ipresenter { private Iview mIview; private ModelImpl model; public PresenterImpl(Iview iview) { mIview = iview; model = new ModelImpl(); } @Override public void startRequest(String url, Map<String, String> map, Class clazz) { //通過M層呼叫M層方法 //model.requestData(); } //防止記憶體洩漏 public void onDetach(){ if(model!=null){ model = null; } if(mIview!=null){ mIview = null; } } }
5.M層介面
package com.example.guoxinyu20181220.model;
import java.util.Map;
public interface Imodel {
void requestData(String url, Map<String,String> map,Class clazz,MyCallBack myCallBack);
}
6.在建立一個介面為了給P層傳遞資料
package com.example.guoxinyu20181220.model; public interface MyCallBack<E> { void setData(E data); }
7.M層的實現類
package com.example.guoxinyu20181220.model;
import com.example.guoxinyu20181220.util.OkHttpUtils;
import java.util.Map;
public class ModelImpl implements Imodel {
private MyCallBack myCallBack;
@Override
public void requestData(String url, Map<String, String> map, Class clazz, MyCallBack myCallBack) {
this.myCallBack = myCallBack;
//呼叫工具類
//post請求
//OkHttpUtils.getIntance().doPost();
//get請求
//OkHttpUtils.getIntance().doGet();
}
}
8.Okhttp網路請求工具類需要建立一個介面ICallBack
package com.example.guoxinyu20181220.util;
public interface ICallBack {
void success(Object o);
void faniled(Exception e);
}
9.Okhttp工具類裡面封裝了get和post請求
package com.example.guoxinyu20181220.util;
import android.os.Handler;
import android.os.Looper;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkHttpUtils {
private static OkHttpUtils intance;
private final OkHttpClient httpClient;
private Handler handler = new Handler(Looper.myLooper());
public OkHttpUtils() {
//日誌攔截器
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient = new OkHttpClient.Builder()
.connectTimeout(10,TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
}
public static OkHttpUtils getIntance() {
if(intance == null){
synchronized (OkHttpUtils.class){
intance = new OkHttpUtils();
}
}
return intance;
}
/**
* 非同步get請求
* */
public void doGet(String url, String params, final Class clazz, final ICallBack iCallBack){
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = httpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.faniled(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String result = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(result, clazz);
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.success(o);
}
});
}catch (Exception e){
iCallBack.faniled(e);
}
}
});
}
/**
* 非同步post請求
* */
public void doPost(String url, Map<String,String> map, final Class clazz, final ICallBack iCallBack){
FormBody.Builder builder = new FormBody.Builder();
for(Map.Entry<String,String> entry:map.entrySet()){
builder.add(entry.getKey(),entry.getValue());
}
RequestBody body = builder.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = httpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.faniled(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String result = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(result, clazz);
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.success(o);
}
});
}catch (Exception e){
iCallBack.faniled(e);
}
}
});
}
}