代码技巧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
- 代码技巧1监听器从子线程切换主线程
- [Android] 任意时刻从子线程切换到主线程的实现
- Android任意时刻从子线程切换到主线程的实现
- [Android] 任意时刻从子线程切换到主线程的实现原理及加强版
- [Android] 任意时刻从子线程切换到主线程的实现
- [Android] 任意时刻从子线程切换到主线程的实现
- [Android] 任意时刻从子线程切换到主线程的实现原理及加强版
- Android 开子线程工作并用监听器传回结果到主线程--子线程与主线程通信
- 线程1-主线程与子线程
- 子线程,主线程
- Android之——任意时刻从子线程切换到主线程的实现(插曲)
- 黑马程序员-多线程-在android开发中经常会遇到从子线程切换到主线程,但是频繁地切换会使代码变得很臃肿,也不好维护,想请教一下各位大牛都是怎么处理的?
- 【Android】从主线程向子线程发消息
- IOS开发 从子线程进入主线程
- Handler从主线程向子线程发送消息
- java子线程全部执行完毕执行主线程代码
- 主线程和子线程
- 主线程和子线程
- Effective C++读书笔记之构造/析构/赋值运算
- 离线轻量级大数据平台Spark之JavaRDD关联join操作
- eclipse高DPI缩放工具
- 蓝桥杯,关于数独的递归思路解决问题
- vsftpd配置文件详解
- 代码技巧1监听器从子线程切换主线程
- es 查询 问题 模糊查询
- 学习感悟2
- jmap查看内存使用情况与生成heapdump--转
- ubuntu记录
- 构建类似Office 2007框架的WPF应用程序(2)
- 性能测试工具之JMeter
- Selective Search 学习笔记
- rizhi