zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    
    }
    
    最近越来越喜欢写抽象类了,每一次精简代码都让人感到很爽,这也算是程序猿的洁癖吧。

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

  • 相关阅读:
    ls命令设计思想
    Collection框架
    Yosemite 的问题
    mac vim的alt键无法正常映射
    Word Ladder
    vim自动补全
    Clone Graph
    C# 关于接口与基类的理解(二者的区别)
    C# 操作Excel基础篇(读取Excel、写入Excel)
    C# 随机数 Radom 循环生成同一的数字
  • 原文地址:https://www.cnblogs.com/ameryzhu/p/6555621.html
Copyright © 2011-2022 走看看