Android Fresco监听回调,成功调回Bitmap
16lz
2021-01-23
不多说了,直接上代码吧~
package com.xxx.xxx.framework.image.fresco.util;import android.graphics.Bitmap;import android.net.Uri;import android.os.Handler;import android.os.Looper;import android.support.annotation.Nullable;import com.facebook.common.executors.UiThreadImmediateExecutorService;import com.facebook.common.references.CloseableReference;import com.facebook.datasource.DataSource;import com.facebook.imagepipeline.core.ImagePipelineFactory;import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;import com.facebook.imagepipeline.image.CloseableImage;import com.facebook.imagepipeline.request.ImageRequest;import com.facebook.imagepipeline.request.ImageRequestBuilder;import com.tuan800.zhe800.framework.image.fresco.callback.FrescoBitmapCallback;import com.tuan800.zhe800.framework.util.StringUtil;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * Created by zhaoyong on 2016/5/27. * 在非主线程里面支持调用 * Fresco加载工具类 * Glide处理非主线程和跨进程的时候有问题,一旦有办法处理就删除本方法 */public class FrescoLoadUtil { private static FrescoLoadUtil inst; private ExecutorService executeBackgroundTask = Executors.newSingleThreadExecutor(); public static FrescoLoadUtil getInstance() { if (inst == null) { inst = new FrescoLoadUtil(); } return inst; } //加载直接返回Bitmap public final void loadImageBitmap(String url, FrescoBitmapCallback callback) { if (StringUtil.isEmpty(url)) { return; } try { fetch(Uri.parse(url), callback); } catch (Exception e) { //oom风险. e.printStackTrace(); callback.onFailure(Uri.parse(url), e); } } private void fetch(final Uri uri, final FrescoBitmapCallback callback) throws Exception { ImageRequestBuilder requestBuilder = ImageRequestBuilder.newBuilderWithSource(uri); ImageRequest imageRequest = requestBuilder.build(); DataSource> dataSource = ImagePipelineFactory.getInstance().getImagePipeline().fetchDecodedImage(imageRequest, null); dataSource.subscribe(new BaseBitmapDataSubscriber() { @Override public void onNewResultImpl(@Nullable final Bitmap bitmap) { if (callback == null) return; if (bitmap != null && !bitmap.isRecycled()) { handlerBackgroundTask(new Callable() { @Override public Bitmap call() throws Exception { final Bitmap resultBitmap = bitmap.copy(bitmap.getConfig(), bitmap.isMutable()); if (resultBitmap != null && !resultBitmap.isRecycled()) postResult(resultBitmap, uri, callback); return resultBitmap; } }); } } @Override public void onCancellation(DataSource> dataSource) { super.onCancellation(dataSource); if (callback == null) return; callback.onCancel(uri); } @Override public void onFailureImpl(DataSource dataSource) { if (callback == null) return; Throwable throwable = null; if (dataSource != null) { throwable = dataSource.getFailureCause(); } callback.onFailure(uri, throwable); } }, UiThreadImmediateExecutorService.getInstance()); } /** * @param callable Callable * @param T * @return Future */ private Future handlerBackgroundTask(Callable callable) { return executeBackgroundTask.submit(callable); } /** * 回调UI线程中去 * * @param result result * @param uri uri * @param callback FrescoBitmapCallback * @param T */ private void postResult(final T result, final Uri uri, final FrescoBitmapCallback callback) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { callback.onSuccess(uri, result); } }); }}
package com.xxx.xxx.framework.image.fresco.callback;import android.net.Uri;/** * Created by zhaoyong on 16/4/18. * */public interface FrescoBitmapCallback { void onSuccess(Uri uri, T result); void onFailure(Uri uri, Throwable throwable); void onCancel(Uri uri);}
更多相关文章
- Android里面WebView加载HTML里面点击按钮调我Android方法
- android 判断是否在主线程的方法
- android解决UI阻塞问题——创建AsyncTask 子线程
- android图片异步加载 列表
- Android多次加载bitmap后,提示内存溢出。可以在onDestroy中释放内
- android studio 55[2]线程更新UI handler 2
- android listview 滚动时异步加载图片的问题
- 【AsynTask】Android异步加载一张图品