//布局文件
//API
public interface Api {
public static final boolean isOnline = false;
public static final String devIp = "http://192.168.43.5";
public static final String wrokIp = "http://172.17.27.34";
public static final String HOST = isOnline ? wrokIp : devIp;
public static final String LOGIN = HOST + "/mobile/index.php?act=login";
}
//BaseNetListener
public class BaseNetListener implements OnNetListener {
@Override
public void onSuccess(BaseBean baseBean) throws IOException {
}
@Override
public void onError(IOException e) {
}
}
//HttpUtil
package com.bwei.net;
import android.content.Context;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
import com.bwei.bean.BaseBean;
import com.bwei.utils.NetWorkUtil;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* Created by peng on 2017/9/27.
*/
public class HttpUtil {
private static volatile HttpUtil httpUtil;
private final OkHttpClient client;
private Context context;
private Handler handler = new Handler(Looper.getMainLooper());
private HttpUtil(Context context) {
//缓存目录
File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");
int cacheSize = 10 * 1024 * 1024;
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
client = new OkHttpClient.Builder()
.addInterceptor(logging)
// .addNetworkInterceptor(new CacheInterceptor())
// .writeTimeout(20, TimeUnit.SECONDS)
// .readTimeout(20, TimeUnit.SECONDS)
// .cache(new Cache(sdcache,cacheSize))
.build();
this.context = context;
}
public static HttpUtil getInstance(Context context) {
if (httpUtil == null) {
synchronized (HttpUtil.class) {
if (httpUtil == null) {
httpUtil = new HttpUtil(context);
}
}
}
return httpUtil;
}
public void doPost(String url, Map params, final Class clazz, final OnNetListener onNetListener) {
//网络判断
if (!NetWorkUtil.isNetworkAvailable(context)) {
Toast.makeText(context, "没有网络,请查看设置", Toast.LENGTH_SHORT).show();
return;
}
if (params != null && params.size() > 0) {
FormBody.Builder builder = new FormBody.Builder();
params.put("client", "android");
for (Map.Entry entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
FormBody formBody = builder.build();
Request request = new Request.Builder().url(url).post(formBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final BaseBean baseBean = (BaseBean) new Gson().fromJson(response.body().string(), clazz);
int code = baseBean.getCode();
if (code == 200) {
handler.post(new Runnable() {
@Override
public void run() {
try {
onNetListener.onSuccess(baseBean);
} catch (IOException e) {
e.printStackTrace();
}
}
});
} else if (code == 400) {
} else if (code == 300) {
}
}
});
}
}
public void download(String url, Callback callback) {
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(callback);
}
public void doGet(String url, final Class clazz, final OnNetListener onNetListener) {
//网络判断
if (!NetWorkUtil.isNetworkAvailable(context)) {
Toast.makeText(context, "没有网络,请查看设置", Toast.LENGTH_SHORT).show();
return;
}
Request.Builder builder = new Request.Builder();
builder.url(url);
final Request request = builder.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onError(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
final BaseBean baseBean = (BaseBean) new Gson().fromJson(string, clazz);
int code = baseBean.getCode();
if (code == 200) {
handler.post(new Runnable() {
@Override
public void run() {
try {
onNetListener.onSuccess(baseBean);
} catch (IOException e) {
e.printStackTrace();
}
}
});
} else if (code == 400) {
} else if (code == 300) {
}
}
});
}
/**
* @param url
* @param params
* @param header
* @param clazz
* @param onNetListener
*/
public void doGet(String url, HashMap params, HashMap header, final Class clazz, final OnNetListener onNetListener) {
//网络判断
if (!NetWorkUtil.isNetworkAvailable(context)) {
Toast.makeText(context, "没有网络,请查看设置", Toast.LENGTH_SHORT).show();
return;
}
Request.Builder builder = new Request.Builder();
if (params != null && params.size() > 0) {
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : params.entrySet()) {
sb.append(url);
sb.append("?");
sb.append(entry.getKey());
sb.append("=");
sb.append(entry.getValue());
}
url = sb.toString();
}
builder.url(url);
//添加请求头
if (params != null && header.size() > 0) {
for (Map.Entry entry : params.entrySet()) {
builder.addHeader(entry.getKey(), entry.getValue());
}
}
final Request request = builder.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
onNetListener.onError(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
final BaseBean baseBean = (BaseBean) new Gson().fromJson(string, clazz);
int code = baseBean.getCode();
if (code == 200) {
handler.post(new Runnable() {
@Override
public void run() {
try {
onNetListener.onSuccess(baseBean);
} catch (IOException e) {
e.printStackTrace();
}
}
});
} else if (code == 400) {
} else if (code == 300) {
}
}
});
}
/**
* 上传
*
* @param url
* @param fileName
*/
public void uploadFile(String url, String fileName) {
String file = Environment.getExternalStorageState() + "/" + fileName;
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
//创建RequestBody 设置类型等
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", fileName, fileBody).build();
Request request = new Request.Builder().url(url).post(requestBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
/**
* 下载
*
* @param url
*/
public void download(String url) {
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
}
//OkHttpUtils
package com.bwei.net;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* Created by peng on 2017/10/11.
* 使用懒汉式创建该对象,并保证线程安全
*/
public class OkHttpUtils {
private static OkHttpUtils okHttpUtils;
private final OkHttpClient httpClient;
private final Handler handler;
//构造方法私有化
private OkHttpUtils() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
httpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();
handler = new Handler(Looper.getMainLooper());
}
public static OkHttpUtils getInstance() {
if (okHttpUtils == null) {
synchronized (OkHttpUtils.class) {
if (okHttpUtils == null) {
okHttpUtils = new OkHttpUtils();
}
}
}
return okHttpUtils;
}
/**
* post请求
*
* @param url
* @param params
* @param clazz
* @param onNetListener
*/
public void doPost(String url, Map params, Class clazz, OnNetListener onNetListener) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
FormBody formBody = builder.build();
Request request = new Request.Builder().url(url).post(formBody).build();
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
public void doGet(String url, Class clazz, OnNetListener onNetListener) {
Request request = new Request.Builder()
.url(url)
.build();
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
handler.post(new Runnable() {
@Override
public void run() {
// onNetListener.onSuccess();
}
});
}
});
}
public void uploadFile(String url, String fileName) {
String file = Environment.getExternalStorageState() + "/" + fileName;
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
//创建RequestBody 设置类型等
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", fileName, fileBody).build();
Request request = new Request.Builder().url(url).post(requestBody).build();
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
public void download(String url) {
Request request = new Request.Builder().url(url).build();
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
}
//OnNetListener
public interface OnNetListener {
public void onSuccess(BaseBean baseBean) throws IOException;
public void onError(IOException e);
}
//MainPresenter
package com.bwei.presenter;
import android.content.Context;
import com.bwei.bean.LoginBean;
import com.bwei.model.LoginListener;
import com.bwei.model.LoginModel;
import com.bwei.mvplogin.IMainListener;
import java.io.IOException;
/**
* Created by peng on 2017/10/24.
*/
public class MainPresenter {
private IMainListener iMainListener;
private Context context;
private final LoginModel loginModel;
public MainPresenter(IMainListener iMainListener) {
this.context = (Context) iMainListener;
this.iMainListener = iMainListener;
loginModel = new LoginModel(context);
}
/**
* 登陆,根据接口观察,需要用户名和密码
*/
public void login() {
//获取用户名
String account = iMainListener.getAccount();
//获取密码
String pwd = iMainListener.getPwd();
loginModel.login(account, pwd, new LoginListener() {
@Override
public void onSuccess(LoginBean loginBean) {
//登陆成功
StringBuilder sb = new StringBuilder();
sb.append(loginBean.getDatas().getUsername());
sb.append(" " + loginBean.getDatas().getUserid());
sb.append(" " + loginBean.getDatas().getKey());
iMainListener.setResult(sb.toString());
}
@Override
public void onError(IOException e) {
//登陆失败
}
});
}
}
//NetWorkUtil
package com.bwei.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* Created by peng on 2017/9/27.
*/
public class NetWorkUtil {
// check all network connect, WIFI or mobile
public static boolean isNetworkAvailable(final Context context) {
boolean hasWifoCon = false;
boolean hasMobileCon = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfos = cm.getAllNetworkInfo();
for (NetworkInfo net : netInfos) {
String type = net.getTypeName();
if (type.equalsIgnoreCase("WIFI")) {
if (net.isConnected()) {
hasWifoCon = true;
}
}
if (type.equalsIgnoreCase("MOBILE")) {
if (net.isConnected()) {
hasMobileCon = true;
}
}
}
return hasWifoCon || hasMobileCon;
}
}
//IMainListener
public interface IMainListener {
public String getAccount();
public String getPwd();
public void setResult(String str);
}
//LoginListener
public interface LoginListener {
public void onSuccess(LoginBean loginBean);
public void onError(IOException e);
}
//LoginModel
public class LoginModel {
private Context context;
public LoginModel(Context context) {
this.context = context;
}
public void login(String account, String pwd, final LoginListener loginListener) {
//在model层里,做真正的登陆请求
Map params = new HashMap<>();
params.put("username", account);
params.put("password", pwd);
params.put("client", "android");
HttpUtil.getInstance(context).doPost(Api.LOGIN, params,LoginBean.class, new OnNetListener() {
@Override
public void onSuccess(BaseBean baseBean) throws IOException {
LoginBean loginBean = (LoginBean) baseBean;
loginListener.onSuccess(loginBean);
}
@Override
public void onError(IOException e) {
loginListener.onError(e);
}
});
}
}
//BaseBean
public class BaseBean {
public int code;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
//LoginBean
package com.bwei.bean;
/**
* Created by peng on 2017/10/10.
*/
public class LoginBean extends BaseBean {
/**
* datas : {"username":"andro","userid":"8","key":"c0e92b92c2e782221a78b8f457389440"}
*/
private DatasBean datas;
public DatasBean getDatas() {
return datas;
}
public void setDatas(DatasBean datas) {
this.datas = datas;
}
public static class DatasBean {
/**
* username : andro
* userid : 8
* key : c0e92b92c2e782221a78b8f457389440
*/
private String username;
private String userid;
private String key;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
}
//mainactivity
package com.bwei.mvplogin;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.bwei.presenter.MainPresenter;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, IMainListener {
/**
* 请输入账号
*/
private EditText mEtAccount;
/**
* 请输入密码
*/
private EditText mEtPwd;
/**
* 登陆
*/
private Button mBtLogin;
private MainPresenter mainPresenter;
private TextView mTv;
/**
* 退出登陆
*/
private Button mBtExit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainPresenter = new MainPresenter(this);
initView();
}
private void initView() {
mEtAccount = (EditText) findViewById(R.id.etAccount);
mEtPwd = (EditText) findViewById(R.id.etPwd);
mBtLogin = (Button) findViewById(R.id.btLogin);
mBtLogin.setOnClickListener(this);
mTv = (TextView) findViewById(R.id.tv);
mBtExit = (Button) findViewById(R.id.btExit);
mBtExit.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btLogin:
//登陆
mainPresenter.login();
break;
case R.id.btExit:
break;
}
}
@Override
public String getAccount() {
return mEtAccount.getText().toString().trim();
}
@Override
public String getPwd() {
return mEtPwd.getText().toString().trim();
}
@Override
public void setResult(String str) {
mTv.setText(str);
}
}
//build.gradle
compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'
//权限