【商城开发七】BaseActivity/BaseFragment篇

写这篇内容的目的就是为了记录自己的成长,从刚开始进公司开发商城项目,到现在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值