代码技巧1监听器从子线程切换主线程

来源:互联网 发布:小榕sql注入工具 编辑:程序博客网 时间:2024/06/05 10:55

举个例子:

在请求一个接口或者进行IO处理的时候,因为这都属于耗时行为,所以都要放到子线程中去,当处理完毕的时候,通常会回调一个接口,

因为接口是在子线程中回调的,所以在回调的地方如果直接操作主线程中的控件会造成BUG。这个BUG我就不贴了。今天看FilerDownloader源码的时候,发现了一个巧妙的写法,就是在接口回调用也定义一个静态内部类,类中的方法就是接口中的方法,然后通过Handler进行线程切换。

/** * OnDetectBigUrlFileListener * <br/> * 探测网络文件监听器(可以支持大文件监听) */public interface OnDetectBigUrlFileListener {    /**     * the url file need to create(no database record for this url file)     *     * @param url      file url     * @param fileName file name     * @param saveDir  saveDir     * @param fileSize fileSize     */    public abstract void onDetectNewDownloadFile(String url, String fileName, String saveDir, long fileSize);    /**     * the url file exist(it is in database record)     *     * @param url file url     */    void onDetectUrlFileExist(String url);    /**     * DetectUrlFileFailed     *     * @param url        file url     * @param failReason fail reason     */    void onDetectUrlFileFailed(String url, DetectBigUrlFileFailReason failReason);    /**     * Callback helper for main thread     */    public static class MainThreadHelper {        /**         * the url file need to create(no database record for this url file)         *         * @param url      file url         * @param fileName file name         * @param saveDir  saveDir         * @param fileSize fileSize         */        public static void onDetectNewDownloadFile(final String url, final String fileName, final String saveDir,                                                   final long fileSize, final OnDetectBigUrlFileListener                                                           nnDetectBigUrlFileListener) {            if (nnDetectBigUrlFileListener == null) {                return;            }            Handler handler = new Handler(Looper.getMainLooper());            handler.post(new Runnable() {                @Override                public void run() {                    if (nnDetectBigUrlFileListener == null) {                        return;                    }                    nnDetectBigUrlFileListener.onDetectNewDownloadFile(url, fileName, saveDir, fileSize);                }            });        }        /**         * the url file exist(it is in database record)         *         * @param url file url         */        public static void onDetectUrlFileExist(final String url, final OnDetectBigUrlFileListener                nnDetectBigUrlFileListener) {            if (nnDetectBigUrlFileListener == null) {                return;            }            Handler handler = new Handler(Looper.getMainLooper());            handler.post(new Runnable() {                @Override                public void run() {                    if (nnDetectBigUrlFileListener == null) {                        return;                    }                    nnDetectBigUrlFileListener.onDetectUrlFileExist(url);                }            });        }        /**         * DetectUrlFileFailed         *         * @param url        file url         * @param failReason fail reason         */        public static void onDetectUrlFileFailed(final String url, final DetectBigUrlFileFailReason failReason, final        OnDetectBigUrlFileListener nnDetectBigUrlFileListener) {            if (nnDetectBigUrlFileListener == null) {                return;            }            Handler handler = new Handler(Looper.getMainLooper());            handler.post(new Runnable() {                @Override                public void run() {                    if (nnDetectBigUrlFileListener == null) {                        return;                    }                    nnDetectBigUrlFileListener.onDetectUrlFileFailed(url, failReason);                }            });        }    }    /**     * DetectUrlFileFailReason     */    public static class DetectBigUrlFileFailReason extends HttpFailReason {        /**         * URL illegal         */        public static final String TYPE_URL_ILLEGAL = DetectBigUrlFileFailReason.class.getName() + "_TYPE_URL_ILLEGAL";        /**         * url over redirect count         */        public static final String TYPE_URL_OVER_REDIRECT_COUNT = DetectBigUrlFileFailReason.class.getName() +                "_TYPE_URL_OVER_REDIRECT_COUNT";        /**         * bad http response code, not 2XX         */        public static final String TYPE_BAD_HTTP_RESPONSE_CODE = DetectBigUrlFileFailReason.class.getName() +                "_TYPE_BAD_HTTP_RESPONSE_CODE";        /**         * the file need to download does not exist         */        public static final String TYPE_HTTP_FILE_NOT_EXIST = DetectBigUrlFileFailReason.class.getName() +                "_TYPE_HTTP_FILE_NOT_EXIST";        public DetectBigUrlFileFailReason(String url, String detailMessage, String type) {            super(url, detailMessage, type);        }        public DetectBigUrlFileFailReason(String url, Throwable throwable) {            super(url, throwable);        }    }}



调用方式

    /**     * notifyDetectNewDownloadFile     */    private boolean notifyDetectNewDownloadFile(String fileName, String saveDir, long fileSize) {        Log.d(TAG, "探测文件不存在,需要创建,url:" + mUrl);        if (mOnDetectBigUrlFileListener != null) {            // main thread notify caller            OnDetectBigUrlFileListener.MainThreadHelper.onDetectNewDownloadFile(mUrl, fileName, saveDir, fileSize,                     mOnDetectBigUrlFileListener);            // return true;        }        // force return true        return true;    }


是不是很方便,下次如果遇到这样的情况直接这样写就好了


0 0
原创粉丝点击