MyCallBack
package com.example.a51044.app55.callback;
public interface MyCallBack<T> {
void onSuccess(T data);
void onFail(T error);
}
View层
package com.example.a51044.app55.ivew;
public interface IVew<T> {
void Success(T data);
void Error(T error);
}
Model层
package com.example.a51044.app55.model;
import com.example.a51044.app55.callback.MyCallBack;
import java.util.Map;
public interface Model {
void start(String url, Map<String,String>map, Class clazz, MyCallBack callBack);
}
Model实现类
package com.example.a51044.app55.model;
import com.example.a51044.app55.callback.MyCallBack;
import com.example.a51044.app55.network.RetrofitUtils;
import com.google.gson.Gson;
import java.util.Map;
public class ModelImpl implements Model {
@Override
public void start(String url, Map<String, String> map, final Class clazz, final MyCallBack callBack) {
RetrofitUtils.getInstance().post(url,map).setHttpListtener(new RetrofitUtils.HttpListtener() {
@Override
public void OnSuccess(String jsonStr) {
Gson gson=new Gson();
Object o = gson.fromJson(jsonStr, clazz);
callBack.onSuccess(o);
}
@Override
public void OnError(String error) {
callBack.onFail(error);
}
});
}
}
MyApiService接口:
package com.example.a51044.app55.network;
import java.util.Map;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
public interface MyApiService {
//第一个url是请求的接口域名,第二个是请求的参数,《ResponeseBody》是响应体,可以是T,可以是基本类
@GET
rx.Observable<ResponseBody> get(@Url String url, @QueryMap Map<String,String>map);
@POST
rx.Observable<ResponseBody>post(@Url String url,@QueryMap Map<String,String>map);
@GET
Call<ResponseBody>get();
}
工具类:
package com.example.a51044.app55.network;
import com.example.a51044.app55.Contacts;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observer;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.observers.SafeSubscriber;
import rx.schedulers.Schedulers;
public class RetrofitUtils {
private MyApiService myApiService;
private RetrofitUtils() {
//日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//设置日志拦截器的等级
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
OkHttpClient okHttpClient = new OkHttpClient.Builder()
//设置读超时
.readTimeout(20, TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//当网络请求失败的时候,等到网络正常自动加载
.retryOnConnectionFailure(true)
.build();
Retrofit retrofit = new Retrofit.Builder()
//添加Gson
.addConverterFactory(GsonConverterFactory.create())
//添加RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//添加地址域名
.baseUrl(Contacts.BASE_URL)
//添加OkHttp
.client(okHttpClient)
.build();
//创建完retrofit,就可以调用myApiService里的方法了
myApiService = retrofit.create(MyApiService.class);
}
//静态内部类
public static RetrofitUtils getInstance()
{
return RetroHolder.retro;
}
private static class RetroHolder
{
private static final RetrofitUtils retro=new RetrofitUtils();
}
//get请求方式
public RetrofitUtils get(String url, Map<String,String>map)
{
//请求网络放在子线程
myApiService.get(url,map).subscribeOn(Schedulers.io())
//成功后回调到主线程(observeOn)是观察者
.observeOn(AndroidSchedulers.mainThread())
//订阅
.subscribe(observer);
//返回本类对象
return RetrofitUtils.getInstance();
}
public RetrofitUtils post(String url,Map<String,String>map)
{
if(map==null)
{
map=new HashMap<>();
}
myApiService.post(url,map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
return RetrofitUtils.getInstance();
}
private Subscriber<ResponseBody>subscriber=new Subscriber<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(ResponseBody responseBody) {
}
};
public Observer observer=new Observer<ResponseBody>() {
//关闭
@Override
public void onCompleted() {
}
//失败
@Override
public void onError(Throwable e) {
if(httpListtener!=null)
{
httpListtener.OnError(e.getMessage());
}
}
//成功
@Override
public void onNext(ResponseBody responseBody) {
if(httpListtener!=null)
{
try {
httpListtener.OnSuccess(responseBody.string());
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
//自定义接口
public interface HttpListtener
{
void OnSuccess(String jsonStr);
void OnError(String error);
}
private HttpListtener httpListtener;
public void setHttpListtener(HttpListtener listtener)
{
this.httpListtener=listtener;
}
}
P层接口:
package com.example.a51044.app55.presenter;
import java.util.Map;
public interface Presenter {
void start(String url, Map<String,String>map,Class clazz);
}
P层实现类:
package com.example.a51044.app55.presenter;
import com.example.a51044.app55.callback.MyCallBack;
import com.example.a51044.app55.ivew.IVew;
import com.example.a51044.app55.model.ModelImpl;
import java.util.Map;
public class PresenterImpl implements Presenter {
private IVew iVew;
private ModelImpl model;
public PresenterImpl(IVew iVew) {
this.iVew = iVew;
model=new ModelImpl();
}
@Override
public void start(String url, Map<String, String> map, Class clazz) {
model.start(url, map, clazz, new MyCallBack() {
@Override
public void onSuccess(Object data) {
iVew.Success(data);
}
@Override
public void onFail(Object error) {
iVew.Error(error);
}
});
}
}
存放接口的类:
package com.example.a51044.app55;
public class Contacts {
public static final String BASE_URL="http://www.zhaoapi.cn/";
public static final String USER_LOGIN="user/login";
public static final String USER_INFO="user/getUserInfo";
public static final String UP_LOAD_IMAGE="file/upload";
}
主页面的代码:
package com.example.a51044.app55;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.a51044.app55.bean.LoginBean;
import com.example.a51044.app55.bean.UserInfoBean;
import com.example.a51044.app55.ivew.IVew;
import com.example.a51044.app55.presenter.PresenterImpl;
import java.util.HashMap;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity<T> extends AppCompatActivity implements IVew<T> {
@BindView(R.id.et_main_name)
EditText etMainName;
@BindView(R.id.et_main_pw)
EditText etMainPw;
@BindView(R.id.button_main_login)
Button buttonMainLogin;
@BindView(R.id.button_main_get_user_info)
Button buttonMainGetUserInfo;
private PresenterImpl presenter;
private final int TYPE_LOGIN=0;
private final int TYPE_UPLOAD_IMG=TYPE_LOGIN+1;
private final int TYPE_GET_USER_INFO=TYPE_UPLOAD_IMG+1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
presenter=new PresenterImpl(this);
}
@OnClick({R.id.button_main_login,R.id.button_main_get_user_info})
public void onViewClicked(View view)
{
switch (view.getId())
{
case R.id.button_main_login:
checkPermission(TYPE_LOGIN);
break;
case R.id.button_main_get_user_info:
checkPermission(TYPE_GET_USER_INFO);
break;
}
}
private void checkPermission(int type_login) {
//判断版本号
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M)
{
//检查版本号,是否成功开启网络权限 if(ContextCompat.checkSelfPermission(this,Manifest.permission.INTERNET)!=PackageManager.PERMISSION_GRANTED)
{
//发送开启网络权限的请求
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET},type_login);
}
else
{
//请求网络
startRequest(type_login);
}
}
else
{
startRequest(type_login);
}
}
private void startRequest(int type)
{
switch (type)
{
case TYPE_LOGIN:
Map<String,String>map=new HashMap<>();
map.put("mobile",etMainName.getText().toString().trim());
map.put("password",etMainPw.getText().toString().trim());
presenter.start(Contacts.USER_LOGIN,map,LoginBean.class);
break;
case TYPE_GET_USER_INFO:
Map<String,String>map1=new HashMap<>();
map1.put("uid","23489");
presenter.start(Contacts.USER_INFO,map1,UserInfoBean.class);
break;
}
}
@Override
public void Success(T data) {
if(data instanceof LoginBean)
{
Toast.makeText(this, ((LoginBean) data).getMsg(), Toast.LENGTH_SHORT).show();
}
else if (data instanceof UserInfoBean)
{
UserInfoBean userInfoBean= (UserInfoBean) data;
Toast.makeText(this, userInfoBean.getMsg(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void Error(T error) {
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//权限的回调方法,判断是否开启权限,如果用户点击开启,就动态开启权限
if(grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
startRequest(requestCode);
}
}
}