利用EventBus及ImageLoader实现截图分享异步加载网络图片

本文介绍了一种使用EventBus和Universal-Image-Loader确保所有图片加载完成后再进行截图分享的方法,解决了部分图标未加载完成导致的分享美观性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用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截图分享.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值