利用EventBus及ImageLoader实现截图分享异步加载网络图片
app截图分享到朋友圈的情况越来越多,而在最近项目开发中出现了截图分享列表时部分图标未加载完成就进行分享,影响了分享的美观性.
于是利用EventBus的异步通知机制及Universal-Image-Loader加载图片进行配合,实现在全部图标读取完成后进行截图分享.
- ListView截图
- EventBus异步通知
- Universal-Image-Loader网络图片加载
图片加载类
/**
* 图片加载类
*/
public class ImageLoaderUtils {
private static DisplayImageOptions sDisplayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.displayer(DefaultConfigurationFactory.createBitmapDisplayer()).build();
public static void displayImage(String picUrl, ImageView imageView) {
//图片开始加载时通知EventBus
EventBus.getDefault().post(new ImageLoadEvent(picUrl));
ImageLoader.getInstance().displayImage(picUrl, imageView,
sDisplayImageOptions, shareLoadImageListener);
}
//用于分享时控制好图片加载
private static ImageLoadingListener shareLoadImageListener = new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
//图片加载结束后通知EventBus
EventBus.getDefault().post(new ImageLoadEvent(imageUri, true));
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//图片加载结束后通知EventBus
EventBus.getDefault().post(new ImageLoadEvent(imageUri, true));
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
};
}
需要从网络加载图片的地方,利用ImageLoaderUtils在网络或者缓存中加载对应图片到ImageView中显示.在图片开始加载及加载完成时分别通知EventBus
需要分享功能的类配置
新增分享处理类 ShareImageHelper
/**
*
* 用于处理部分页面需要读取图片后才能分享
*/
public class ShareImageHelper {
private Timer timer = new Timer();
private Shareable activity;
private Map<String, Boolean> imageMap = new HashMap<>();
//读取图片
private boolean startShare = false;
private boolean loadShare = false;
//防止界面未渲染完就进行分享
private boolean readyShare = false;
private boolean shareLimit = false;
public ShareImageHelper2(Shareable activity) {
this.activity = activity;
}
//用于判断图片是否加载完成
public boolean hasLoadImage() {
int loadCount = CommonUtil.countLoadedImage(imageMap);
int shareCount = imageMap.size();
if (shareCount > 0 && shareCount > loadCount) {
Log.i("screenshot share","图片完成加载后即可截图分享");
return false;
}
return true;
}
//响应图片读取事件
public void setLoadImage(ImageLoadEvent event) {
if (!event.finish) {
startShare = true;
}
imageMap.put(event.url, event.finish);
if (event.finish) {
finishLoadImage();
}
}
//完成全部图片读完就自动分享
private void finishLoadImage() {
int loadCount = CommonUtil.countLoadedImage(imageMap);
int shareCount = imageMap.size();
if (loadCount == shareCount && startShare && !loadShare && !shareLimit && readyShare) {
loadShare = true;
activity.share();
}
}
private TimerTask shareLimitTimerTask = new TimerTask() {
@Override
public void run() {
shareLimit = false;
}
};
//避免时间通知过快多次分享
public void limitShare() {
shareLimit = true;
timer.schedule(shareLimitTimerTask, 100);
}
public void shareReady() {
readyShare = true;
}
}
可分享页面继承接口Shareable
public interface Shareable {
void share();
}
EventBus配置
新建图片加载通知类ImageLoadEvent
public class ImageLoadEvent {
public ImageLoadEvent(String url) {
this.url = url;
}
public ImageLoadEvent(String url, boolean finish) {
this.finish = finish;
this.url = url;
}
//是否加载完成
public boolean finish = false;
//对应加载的url
public String url;
}
注册EventBus及ShareImageHelper
//分享的Activity 要继承Shareable接口
public class ShareActivity extends Activity implements Shareable
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
EventBus.getDefault().register(this);
shareImageHelper = new ShareImageHelper(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
在对应需要截图分享的类进行注册事件
public void onEventMainThread(ImageLoadEvent event) {
shareImageHelper.setLoadImage(event);
}
在share()方法中进行截图分享
@Override
public void share() {
//自定义的截图方法
final Bitmap bitmap = getBitmapByView(listview);
if (!shareImageHelper.hasLoadImage()) {//如果未读取完毕就停止分享
return;
}
//自定义截图分享
ShareUtil.shareBitmap(mActivity, bitmap, loadingDialog);
}
总结
在某些ListView,RecyclerView中遇到截图分享时,可以利用EventBus异步加载进行通知完成后进行获取bitmap截图分享.