友盟umeng分享微信和朋友圈,图片太大,拉起微信很慢的处理方案

今天测试提了个问题,说微信分享反应很慢,而且说上个版本都还是快的,这个版本就慢了,我回忆了下,这个版本关于分享的都没做改动啊,我就去调查了下原因,原来是分享时候的图片超级大导致的,上个版本分享的图片很小所以很快,原因找到了,开始着手解决。

1 分享的图片是服务器返回的,所以大小由服务器控制,既然图片太大,好几M,那么只需要服务端对图片压缩处理一下再返回给我们就好了,友盟分享的官方文档给的图片大小的建议:

友盟umeng分享微信和朋友圈,图片太大,拉起微信很慢的处理方案_第1张图片

所以按照文档的要求返回图片的尺寸,拉起微信的速度肯定会很快,如果服务端没法压缩,那么就我们客户端自己来压缩处理也是可以的哈。

2 自己压缩的话,首先要把需要分享用到的图片下载下来,正好官方给出了好几种加载图片的方式

友盟umeng分享微信和朋友圈,图片太大,拉起微信很慢的处理方案_第2张图片

我们可以使用本地文件或者bitmap文件的方式加载,我这里使用bitmap的方式,首先是下载图片

    /**
     * 下载图片保存到本地
     * @param context
     * @param imageUrl
     */
    public static void downloadShareImg(final Context context,final String imageUrl) {
        FileUtil.clearBitmap();
        Glide.with(context)
                .load(imageUrl)
                .asBitmap()
                .into(new SimpleTarget() {
                    @Override
                    public void onResourceReady(final Bitmap bitmap, GlideAnimation glideAnimation) {
                        FileUtil.saveBitmap(context, bitmap);
                    }

                    @Override
                    public void onLoadFailed(Exception e, Drawable errorDrawable) {
                        super.onLoadFailed(e, errorDrawable);
                    }
                });
    }

我使用glide对图片进行下载,下载之前记得要删除之前下载过的分享的图片,不然有可能会出现分享图片错乱的问题,然后下载好后,保存到本地

 /**
     * 保存bitmap到本地
     *
     * @param context
     * @param mBitmap
     * @return
     */
    public static String saveBitmap(Context context, Bitmap mBitmap) {
        String savePath;
        File filePic;
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            savePath = SD_PATH;
        } else {
            savePath = context.getApplicationContext().getFilesDir()
                    .getAbsolutePath()
                    + IN_PATH;
        }
        try {
            filePic = new File(savePath + SHARE_IMAGE + ".jpg");
            if (!filePic.exists()) {
                filePic.getParentFile().mkdirs();
                filePic.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(filePic);
            mBitmap.compress(Bitmap.CompressFormat.JPEG, 25, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }

        return filePic.getAbsolutePath();
    }

保存图片的时候,要对图片进行压缩,这也是我们下载图片的目的哈,使用bitmap.compress()方法进行压缩,压缩好之后就是获取bitmap,由于在下载的时候已经对图片进行了压缩,所以这里就不用再对图片进行二次采样了。


    /**
     * 获取下载到本地的图片的bitmap
     * @return
     */
    public static Bitmap getBitmap(){
        try {
            FileInputStream fis = new FileInputStream(SHARE_IMAGE_SD_PATH);
            return BitmapFactory.decodeStream(fis);
//          BitmapFactory.Options options = new BitmapFactory.Options();
//          options.inJustDecodeBounds = true;
//          BitmapFactory.decodeStream(fis,null, options);
//          调用上面定义的方法计算inSampleSize值
//          options.inSampleSize = 2;
//          使用获取到的inSampleSize值再次解析图片
//          options.inJustDecodeBounds = false;
//          return BitmapFactory.decodeStream(fis,null, options);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

记得下载之前要清除原来的图片

  /**
     * 清除下载的本地分享图片
     */
    public static void clearBitmap() {
        File filePic = new File(SHARE_IMAGE_SD_PATH);
        if (filePic.exists()) {
            filePic.delete();
        }
    }

一切准备就绪后,就是在分享的地方,获取到下载好的bitmap,然后要先判断bitmap是否为null,如果为null就使用网络原图,防止分享出问题(慢总比出问题强)

 Bitmap bitmap = FileUtil.getBitmap();
 if(bitmap == null){
          web.setThumb(new UMImage(activity, imageUrl));  //网络缩略图
 }else{
          web.setThumb(new UMImage(activity, bitmap));  //本地缩略图
 }

OK,这样就在服务端没法修改图片的大小的情况下,解决了umeng分享拉起微信很慢的问题。

你可能感兴趣的:(Android)