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

举个例子:

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

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

/**
 * OnDetectBigUrlFileListener
 * 
* 探测网络文件监听器(可以支持大文件监听) */ 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;
    }


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


你可能感兴趣的:(Android,项目实战)