【商城开发七】BaseActivity/BaseFragment篇

来源:互联网 发布:关闭数据库的命令 编辑:程序博客网 时间:2024/06/08 18:11

写这篇内容的目的就是为了记录自己的成长,从刚开始进公司开发商城项目,到现在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与这边一样就不贴了,记录自己的成长~

0 0
原创粉丝点击