友盟umeng分享微信和朋友圈,图片太大,拉起微信很慢的处理方案
今天测试提了个问题,说微信分享反应很慢,而且说上个版本都还是快的,这个版本就慢了,我回忆了下,这个版本关于分享的都没做改动啊,我就去调查了下原因,原来是分享时候的图片超级大导致的,上个版本分享的图片很小所以很快,原因找到了,开始着手解决。
1 分享的图片是服务器返回的,所以大小由服务器控制,既然图片太大,好几M,那么只需要服务端对图片压缩处理一下再返回给我们就好了,友盟分享的官方文档给的图片大小的建议:
所以按照文档的要求返回图片的尺寸,拉起微信的速度肯定会很快,如果服务端没法压缩,那么就我们客户端自己来压缩处理也是可以的哈。
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<Bitmap>() {
@Override
public void onResourceReady(final Bitmap bitmap, GlideAnimation<? super Bitmap> 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分享拉起微信很慢的问题。