• AsyncTask异常处理


    在运行AsyncTask之前总是要做网络判断操作,还有超时操作等,每写一个AsyncTask都要重新写一遍很是烦人。于是做了个封装。

    /**
     * 封装了对异常的处理,不再需要给AsyncTask做各种网络状态以及结果为空的判断
     * 需要实现doInBackgroundX(Params... params)和onPostExecuteX(Result result)方法。
     * Created by Amery on 13-11-6.
     */
    public abstract class AsyncTaskX<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
        private Exception e = null;
        private Context context;
    
        public AsyncTaskX(Context context) {
            super();
            this.context = context;
        }
    
        /**
         * 直接填写要加入的任务即可,不需要关心异常处理。
         * 注意:禁止在此处调用super.doInBackground()否则会出现无限递归,导致stackOverFlow异常
         * @param params
         * @return
         * @throws Exception
         */
        protected abstract Result doInBackgroundX(Params... params) throws Exception;
    
        /**
         * 返回的结果不需要判断是否为空
         *注意:禁止在此处调用super.doPostExecute()否则会出现无限递归,导致stackOverFlow异常
         * @param result
         */
        protected abstract void onPostExecuteX(Result result);
    
        /**
         * 显示刷新界面
         */
        protected abstract void showRefreshView();
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //网络判断
            if (!NetworkUtils.isNetworkAvailable(context)) {
                cancel(true);
                Toast.makeText(context, ToastMessage.NO_NET.value, Toast.LENGTH_SHORT).show();
                showRefreshView();
            }
        }
    
        @Override
        protected Result doInBackground(Params... params) {
            try {
                return doInBackgroundX(params);
            } catch (Exception e) {
                this.e = e;
                e.printStackTrace();
                return null;
            }
    
        }
    
        @Override
        protected void onPostExecute(Result result) {
            super.onPostExecute(result);
            //如果当前任务已经取消了,则直接返回
            if(isCancelled()){
                return;
            }
            if (result == null) {
                //无网络异常
                if (e != null && e instanceof SocketException)
                    Toast.makeText(context, ToastMessage.NO_DATA.value, Toast.LENGTH_SHORT).show();
                //网络超时
                if (e != null && e instanceof SocketTimeoutException || e instanceof UnknownHostException)
                    Toast.makeText(context, ToastMessage.TIME_OUT.value, Toast.LENGTH_SHORT).show();
                //显示刷新界面
                showRefreshView();
            } else {
                onPostExecuteX(result);
            }
        }
    
    }
    
    最近越来越喜欢写抽象类了,每一次精简代码都让人感到很爽,这也算是程序猿的洁癖吧。

    晚上一个人写代码很安静,效率很高,可是对身体不好。

  • 相关阅读:
    Internet Explorer 安全区域注册表项说明
    Android强制设置横屏或竖屏
    SQLite to Asp.net Entity Framework 部署问题
    获取地里位置信息
    通信API、使用Web Workers处理线程
    本地存储、离线应用程序
    多媒体播放
    绘制图形
    表单与文件
    HTML5的结构
  • 原文地址:https://www.cnblogs.com/ameryzhu/p/6555621.html
Copyright © 2020-2023  润新知