写这篇内容的目的就是为了记录自己的成长,从刚开始进公司开发商城项目,到现在60多天自己成长了不少,也把app的base类完全改写了。、
文章主要记录自己的成长和想法,大神请无视~~~好了开始正题
BaseActivity——项目相当重要的一个类,为了以后拓展方便,也为了兼容之前的旧版,把这个类分为3个部分,分别是:
BaseActivity:目前主要负责Toast和和CheckPermission
public class BaseActivity extends AppCompatActivity {
private PermissionCallback requestPermissionAndBack;
protected void showToast(String content) {
Toast.makeText(this, content, Toast.LENGTH_SHORT).show();
}
protected void showToast(int content) {
Toast.makeText(this, content, Toast.LENGTH_SHORT).show();
}
public interface PermissionCallback {
void requestPermissionAndBack(boolean isOk);
}
/**
* 申请权限
*
* @param permissions
*/
protected void checkAndRequestAllPermission(String[] permissions, PermissionCallback requestPermissionAndBack) {
this.requestPermissionAndBack = requestPermissionAndBack;
if (permissions == null) {
return;
}
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(permissions, 1);
}
}
public void setRequestPermissionAndBack(PermissionCallback requestPermissionAndBack) {
this.requestPermissionAndBack = requestPermissionAndBack;
}
/**
* 申请权限
*
* @param permissions
*/
protected void checkAndRequestAllPermission(String[] permissions) {
if (permissions == null) {
return;
}
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(permissions, 1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] per,
@NonNull int[] grantResults) {
boolean isAll = true;
for (int i = 0; i < per.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
isAll = false;
break;
}
}
if (!isAll) {
showToast(getResources().getString(R.string.no_permission));
}
if (requestPermissionAndBack != null) {
requestPermissionAndBack.requestPermissionAndBack(isAll);//isAll 用户是否拥有所有权限
}
super.onRequestPermissionsResult(requestCode, per, grantResults);
}
}
功能目前还比较少,但是很常用。
BaseActivityNet:主要负责与服务端进行交互(初级交互:只是传递数据,不做任何处理,使用抽象类传递到上层进行处理数据)
本类还负责监听网络的状态,目前是每次请求网络的时候会回调网络状态,以后会加上广播和服务,同时还有加入缓存的方法,网络框架用的NoHtpp,非常感谢框架的提供者(https://github.com/yanzhenjie/NoHttp)附上大神的github项目地址,表示感谢。
public abstract class BaseActivityNet extends BaseActivity {
private DialogManager2 dialogManager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (dialogManager == null) {
dialogManager = new DialogManager2(this);
}
}
//数据请求成功
protected abstract void requstSuccess(int what, JSONObject object);
//请求服务器失败
protected abstract void requstFailed(int what, Exception e);
//请求完成
protected abstract void requstFinish(int what);
protected abstract void isNetWork(boolean isNetWork);
/**
* 建立网络请求
*
* @param url 请求网址
* @param method 请求方式 0 post 1 get
* @param defaultParam 是否有默认请求参数
*/
protected Request<JSONObject> buildNetRequest(String url, int method, boolean defaultParam) {
Request<JSONObject> jsonRequest = NoHttp.createJsonObjectRequest(url, method == 0 ? RequestMethod.POST : RequestMethod.GET);
if (hasCache()) {
jsonRequest.setCacheMode(CacheMode.REQUEST_NETWORK_FAILED_READ_CACHE);
}
if (defaultParam) {
int uuid = AppConfig.getInstance().getInt("uuid", -1000);
String token = AppConfig.getInstance().getString("token", "");
long expiring_time = AppConfig.getInstance().getLong("expiring_time", -2000);
jsonRequest.add("sign", UrlEncodeUtils.createSign(url));
jsonRequest.add("uuid", uuid);
jsonRequest.add("token", token);
jsonRequest.add("expiring_time", expiring_time);
}
return jsonRequest;
}
//执行网络请求
protected void executeNetWork(int what, Request<JSONObject> jsonRequest, String message) {
boolean netAva = NetUtils.isNetworkAvailable(this);
isNetWork(netAva);
if (!netAva) {
dialogManager.buildAlertDialog(getResources().getString(R.string.no_network));
return;
}
MyApplication.getRequestQueue().add(what, jsonRequest, new NetResponseListener());
dialogManager.buildWaitDialog(message);
}
//执行网络请求
protected void executeNetWork(Request<JSONObject> jsonRequest, String message) {
boolean netAva = NetUtils.isNetworkAvailable(this);
isNetWork(netAva);
if (!netAva) {
dialogManager.buildAlertDialog(getResources().getString(R.string.no_network));
return;
}
MyApplication.getRequestQueue().add(0, jsonRequest, new NetResponseListener());
dialogManager.buildWaitDialog(message);
}
protected class NetResponseListener implements OnResponseListener<JSONObject> {
@Override
public void onStart(int what) {
}
@Override
public void onSucceed(int what, Response<JSONObject> response) {
requstSuccess(what, response.get());
}
@Override
public void onFailed(int what, Response<JSONObject> response) {
requstFailed(what, response.getException());
}
@Override
public void onFinish(int what) {
requstFinish(what);
}
}
/**
* 获取DialogManager
*
* @return
*/
public DialogManager2 getDm() {
if (dialogManager == null) {
dialogManager = new DialogManager2(this);
}
dialogManager.dismissDialog();
return dialogManager;
}
/**
* 取消执行网络请求
*/
protected void cancelNetWork() {
MyApplication.getRequestQueue().cancelAll();
}
/**
* 是否启用缓存
*
* @return
*/
protected boolean hasCache() {
return false;
}
}
这里有两个执行网络请求的方法,第二个带了int what的参数,这个参数可以判断是哪次网络请求,旧版没用到,所有为了兼容旧版,就要写两个方法了。
BaseNetActivity:也是抽象类,初步处理服务端返回的数据,Activity的亲爸爸。
public abstract class BaseNetActivity extends BaseActivityNet {
public static int REQUEST_LOGIN;
private Callback callback;
private CallbackWhat callbackWhat;
@Override
protected void requstSuccess(int what, JSONObject jObj) {
try {
int status = jObj.optInt("status");
String message = jObj.optString("msg");
JSONObject dataObj = jObj.optJSONObject("data");
if (status == 200) {
int update_status = dataObj.optInt("update_status");
if (update_status == 1) {
AppConfig.getInstance().putString("token", dataObj.optString("token"));
AppConfig.getInstance().putLong("expiring_time", dataObj.optLong("expiring_time"));
}
if (callback != null) {//对于200额外的处理
callback.handle200Data(dataObj, message);
}
if (callbackWhat != null) {
callbackWhat.handle200Data(what, dataObj, message);
}
mhandle200Data(what, jObj, dataObj, message);
} else if (status == 1 || status == 2 || status == 3 || status == 4 || status == 5) {//缺少sign参数
mhandleReLogin(what);
Intent intent = new Intent(this, LoginActivity.class);
AppConfig.getInstance().putInt("uuid", -1000);
startActivityForResult(intent, REQUEST_LOGIN);
((MyApplication) getApplication()).exit();
} else if (status == 404) {
if (callback != null) {
callback.handle404(message);
}
if (callbackWhat != null) {
callbackWhat.handle404(what, message);
}
mhandle404(what, dataObj, message);
} else if (status == 500) {
getDm().buildAlertDialog(message);
} else if (status == 6) {
getDm().buildAlertDialog(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void requstFailed(int what, Exception e) {
mhandleFailed(what, e);
}
@Override
protected void requstFinish(int what) {
try {
if (getDm() != null) {
getDm().dismissDialog();
}
} catch (Exception e) {
e.printStackTrace();
}
mhandleFinish(what);
}
@Override
protected void isNetWork(boolean isNetWork) {
mhandleHasNetWord(isNetWork);
if (!isNetWork) {
//没网
if (callback != null) {
callback.handleNoNetWork();
}
if (callbackWhat != null) {
callbackWhat.handleNoNetWork();
}
mhandleNoNetWord();
}
}
protected void setCallback(Callback callback) {
this.callback = callback;
}
public interface Callback {
void handle200Data(JSONObject dataObj, String message);
void handle404(String message);
void handleNoNetWork();
}
protected void setCallbackWhat(CallbackWhat callbackWhat) {
this.callbackWhat = callbackWhat;
}
public interface CallbackWhat {
void handle200Data(int what, JSONObject dataObj, String message);
void handle404(int what, String message);
void handleNoNetWork();
}
protected void mhandle200Data(int what, JSONObject object, JSONObject dataObj, String message) {
}
protected void mhandle404(int what, JSONObject object, String message) {
}
protected void mhandleFinish(int what) {
}
protected void mhandleFailed(int what, Exception e) {
}
public static void setRequestCode(int requestLogin) {
REQUEST_LOGIN = requestLogin;
}
protected void mhandleReLogin(int what) {
}
protected void mhandleNoNetWord() {
}
protected void mhandleHasNetWord(boolean isNetWork) {
}
}
其中有接口,也有受保护的方法,一方面为了兼容旧版,另一方便也为了使用方便,方法多任性。
这一层简单的解析数据,状态码在这层解析成具体的情况,传给Activity,比如:404错误、500错误、超时登录等。另还有200以后附带需要解析显示的数据也传给子类。
这种情况就是被挤下线,用户请求服务端会被强制跳转到登录页面,大家自己看其中有一个REQUST_LOGIN静态int变量还有set方法,这个是为了下节做登录事件准备的,现在可以不关注它。
BaseFragment与这边一样就不贴了,记录自己的成长~