Skip to content

Commit

Permalink
将序列化和压缩bmp变成异步操作
Browse files Browse the repository at this point in the history
  • Loading branch information
Kale committed Mar 21, 2017
1 parent 2c66a93 commit e2ef301
Show file tree
Hide file tree
Showing 12 changed files with 251 additions and 95 deletions.
7 changes: 7 additions & 0 deletions app/src/main/java/com/liulishuo/engzo/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,13 @@ public void onClick(View v) {
case R.id.分享到微博:
SsoShareManager.share(this, SsoShareType.WEIBO_TIME_LINE, mShareContent, mShareListener);
break;
case R.id.分享到微博_不带跳转链接:
// 解开注释即可测试
if (mShareContent instanceof ShareContentWebPage) {
// ((ShareContentWebPage) mShareContent).setUrl(null);
}
SsoShareManager.share(this, SsoShareType.WEIBO_TIME_LINE, mShareContent, mShareListener);
break;
case R.id.分享给微信好友:
SsoShareManager.share(this, SsoShareType.WEIXIN_FRIEND, mShareContent, mShareListener);
break;
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,14 @@
android:text="分享到微博"
/>

<Button
android:id="@+id/分享到微博_不带跳转链接"
android:layout_width="180dp"
android:layout_height="40dp"
android:onClick="onClick"
android:text="分享到微博(不带URL)"
/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand Down
3 changes: 1 addition & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath "net.rdrei.android.buildtimetracker:gradle-plugin:0.5.+"
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'me.tatarka:gradle-retrolambda:3.6.0'
}
}

Expand Down
6 changes: 6 additions & 0 deletions lib/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'me.tatarka.retrolambda'

android {
compileSdkVersion 24
Expand All @@ -16,6 +17,11 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

}

Expand Down
96 changes: 96 additions & 0 deletions lib/src/main/java/com/liulishuo/share/SlUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.liulishuo.share;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
import android.support.annotation.Nullable;
import android.text.TextUtils;

/**
* @author Kale
* @date 2017/3/21
*/
class SlUtils {

/**
* Note:外部传入的bitmap可能会被用于其他的地方,所以这里不能做recycle()
*/
@Nullable
static byte[] getImageThumbByteArr(@Nullable Bitmap src) {
if (src == null) {
return null;
}

final Bitmap bitmap;
if (src.getWidth() > 250 || src.getHeight() > 250) {
bitmap = ThumbnailUtils.extractThumbnail(src, 250, 250);
} else {
bitmap = src;
}

byte[] thumbData = null;
ByteArrayOutputStream outputStream = null;
try {
outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outputStream);
thumbData = outputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}*/
}
return thumbData;
}

/**
* 此方法是耗时操作,如果对于特别大的图,那么需要做异步
*
* Note:外部传入的bitmap可能会被用于其他的地方,所以这里不能做recycle()
*/
static String saveLargeBitmap(final Bitmap bitmap) {
if (bitmap == null) {
return null;
}

String path = SlConfig.pathTemp;
if (!TextUtils.isEmpty(path)) {
String imagePath = path + "sl_large_pic";
FileOutputStream fos = null;
try {
fos = new FileOutputStream(imagePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}*/
}
return imagePath;
} else {
return null;
}
}
}
22 changes: 22 additions & 0 deletions lib/src/main/java/com/liulishuo/share/SsoShareManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.liulishuo.share.activity.SL_WeiBoHandlerActivity;
import com.liulishuo.share.activity.SL_WeiXinHandlerActivity;
import com.liulishuo.share.content.ShareContent;
import com.liulishuo.share.content.ShareContentPic;
import com.liulishuo.share.type.SsoShareType;

import static com.liulishuo.share.type.SsoShareType.QQ_FRIEND;
Expand All @@ -31,6 +32,27 @@ public class SsoShareManager {
public static void share(@NonNull final Activity activity, @SsoShareType final String shareType,
@NonNull final ShareContent shareContent, @Nullable final ShareStateListener listener) {
SsoShareManager.listener = listener;

if (shareContent instanceof ShareContentPic) {
final ShareContentPic content = (ShareContentPic) shareContent;

new Thread() {
@Override
public void run() {
super.run();
content.setThumbBmpBytes(SlUtils.getImageThumbByteArr(content.getThumbBmp()));
content.setLargeBmpPath(SlUtils.saveLargeBitmap(content.getLargeBmp()));
activity.runOnUiThread(() -> doShareSync(activity, shareType, shareContent, listener));
}
}.start();
} else {
doShareSync(activity, shareType, shareContent, listener);
}
}

private static void doShareSync(@NonNull Activity activity, @SsoShareType String shareType,
@NonNull ShareContent shareContent, @Nullable ShareStateListener listener) {

switch (shareType) {
case QQ_FRIEND:
case QQ_ZONE:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ protected void onCreate(Bundle savedInstanceState) {
initShareListener(SsoShareManager.listener);

if (savedInstanceState == null) {
ShareContent shareContent = (ShareContent) intent.getSerializableExtra(SsoShareManager.KEY_CONTENT);
ShareContent shareContent = intent.getParcelableExtra(SsoShareManager.KEY_CONTENT);
doShare(shareContent, appId);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ private void doShare(Activity activity, String appId) {
// 建立请求体
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());// 用transaction唯一标识一个请求
ShareContent content = (ShareContent) getIntent().getSerializableExtra(SsoShareManager.KEY_CONTENT);
ShareContent content = getIntent().getParcelableExtra(SsoShareManager.KEY_CONTENT);
if (content == null) {
throw new NullPointerException("ShareContent is null,intent = " + getIntent());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.liulishuo.share.content;

import java.io.Serializable;
import android.os.Parcelable;

import com.liulishuo.share.type.ShareContentType;

/**
* Created by echo on 5/18/15.
*/

public interface ShareContent extends Serializable {
public interface ShareContent extends Parcelable {

/**
* @return 分享的方式
Expand Down
128 changes: 44 additions & 84 deletions lib/src/main/java/com/liulishuo/share/content/ShareContentPic.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
package com.liulishuo.share.content;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
import android.support.annotation.NonNull;
import android.os.Parcel;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import com.liulishuo.share.SlConfig;
import com.liulishuo.share.type.ShareContentType;

/**
Expand All @@ -20,9 +12,8 @@
*/
public class ShareContentPic implements ShareContent {

/**
* 图片的byte数组
*/
private Bitmap thumbBmp, largeBmp;

private byte[] thumbBmpBytes;

private String largeBmpPath;
Expand All @@ -31,12 +22,8 @@ public class ShareContentPic implements ShareContent {
* @param thumbBmp 如果需要分享图片,则必传
*/
public ShareContentPic(@Nullable Bitmap thumbBmp, @Nullable Bitmap largeBmp) {
if (thumbBmp != null) {
thumbBmpBytes = getImageThumbByteArr(thumbBmp);
}
if (largeBmp != null) {
largeBmpPath = saveLargeBitmap(largeBmp);
}
this.thumbBmp = thumbBmp;
this.largeBmp = largeBmp;
}

@Override
Expand Down Expand Up @@ -75,74 +62,47 @@ public int getType() {
return ShareContentType.PIC;
}

/**
* Note:外部传入的bitmap可能会被用于其他的地方,所以这里不能做recycle()
*/
private
@Nullable
byte[] getImageThumbByteArr(@NonNull Bitmap src) {
final Bitmap bitmap;
if (src.getWidth() > 250 || src.getHeight() > 250) {
bitmap = ThumbnailUtils.extractThumbnail(src, 250, 250);
} else {
bitmap = src;
}
public Bitmap getThumbBmp() {
return thumbBmp;
}

byte[] thumbData = null;
ByteArrayOutputStream outputStream = null;
try {
outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outputStream);
thumbData = outputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bitmap != null && !bitmap.isRecycled()) {
// bitmap.recycle();
}
}
return thumbData;
public Bitmap getLargeBmp() {
return largeBmp;
}

/**
* 此方法是耗时操作,如果对于特别大的图,那么需要做异步
*
* Note:外部传入的bitmap可能会被用于其他的地方,所以这里不能做recycle()
*/
private String saveLargeBitmap(final Bitmap bitmap) {
String path = SlConfig.pathTemp;
if (!TextUtils.isEmpty(path)) {
String imagePath = path + "sl_large_pic";
FileOutputStream fos = null;
try {
fos = new FileOutputStream(imagePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bitmap != null && !bitmap.isRecycled()) {
// bitmap.recycle();
}
}
return imagePath;
} else {
return null;
}
public void setThumbBmpBytes(byte[] thumbBmpBytes) {
this.thumbBmpBytes = thumbBmpBytes;
}

public void setLargeBmpPath(String largeBmpPath) {
this.largeBmpPath = largeBmpPath;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByteArray(this.thumbBmpBytes);
dest.writeString(this.largeBmpPath);
}

ShareContentPic(Parcel in) {
this.thumbBmpBytes = in.createByteArray();
this.largeBmpPath = in.readString();
}

public static final Creator<ShareContentPic> CREATOR = new Creator<ShareContentPic>() {
@Override
public ShareContentPic createFromParcel(Parcel source) {
return new ShareContentPic(source);
}

@Override
public ShareContentPic[] newArray(int size) {
return new ShareContentPic[size];
}
};
}
Loading

0 comments on commit e2ef301

Please sign in to comment.