Skip to content

Commit

Permalink
修复可能的oom,后续继续观察
Browse files Browse the repository at this point in the history
  • Loading branch information
CPPAlien committed Nov 12, 2016
1 parent 005be8a commit ee66b4a
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 60 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'com.android.tools.build:gradle:2.2.2'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
11 changes: 5 additions & 6 deletions davinci/src/main/java/cn/hadcn/davinci/image/ReadImageTask.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cn.hadcn.davinci.image;

import android.content.Context;
import android.os.Looper;
import android.widget.ImageView;

import cn.hadcn.davinci.R;
Expand All @@ -15,7 +14,7 @@
* read image from any where
* Created by 90Chris on 2016/5/5.
*/
public class ReadImageTask {
class ReadImageTask {
private final int DEFAULT_IMAGE_LOADING = R.drawable.image_loading;
private final int DEFAULT_IMAGE_ERROR = R.drawable.image_load_error;

Expand All @@ -29,14 +28,14 @@ public class ReadImageTask {
private int mMaxSize;
private int mKeyMode;

public ReadImageTask(Context context, VinciImageLoader.ImageCache imageCache, ImageLoader imageLoader, String imageUrl) {
ReadImageTask(Context context, VinciImageLoader.ImageCache imageCache, ImageLoader imageLoader, String imageUrl) {
mImageUrl = imageUrl;
mImageCache = imageCache;
mImageLoader = imageLoader;
mContext = context;
}

public final void execute(String requestBody) {
final void execute(String requestBody) {
if ( mImageUrl == null || mImageUrl.isEmpty() || Util.generateKey(mImageUrl).isEmpty() ) {
mImageView.setImageDrawable(mContext.getResources().getDrawable(mErrorImage));
return;
Expand Down Expand Up @@ -70,7 +69,7 @@ public final void execute(String requestBody) {
}
}

protected void setView(ImageView imageView, int image_loading, int image_error) {
void setView(ImageView imageView, int image_loading, int image_error) {
mImageView = imageView;
if ( image_loading != 0 ) mLoadingImage = image_loading;
if ( image_error != 0 ) mErrorImage = image_error;
Expand All @@ -80,7 +79,7 @@ protected void setView(ImageView imageView) {
mImageView = imageView;
}

protected void setSize(int size, int mode) {
void setSize(int size, int mode) {
mMaxSize = size;
mKeyMode = mode;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*
* Created by 90Chris on 2016/5/5.
*/
public class VolleyImageListener implements ImageLoader.ImageListener {
class VolleyImageListener implements ImageLoader.ImageListener {
private ImageView mImageView;
private int mLoadingImage;
private int mErrorImage;
Expand All @@ -27,18 +27,18 @@ public class VolleyImageListener implements ImageLoader.ImageListener {
private Context mContext;
private VinciImageLoader.ImageCache mImageCache;

protected VolleyImageListener(Context context, ImageView imageView, VinciImageLoader.ImageCache imageCache) {
VolleyImageListener(Context context, ImageView imageView, VinciImageLoader.ImageCache imageCache) {
this.mImageView = imageView;
mContext = context;
mImageCache = imageCache;
}

protected void setMaxSize(int size, int mode) {
void setMaxSize(int size, int mode) {
mMaxSize = size;
mKeyMode = mode;
}

protected void setDefaultImage(int loadingImage, int errorImage) {
void setDefaultImage(int loadingImage, int errorImage) {
mLoadingImage = loadingImage;
mErrorImage = errorImage;
}
Expand All @@ -61,14 +61,17 @@ public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate)

int bHeight = bitmap.getHeight();
int bWidth = bitmap.getWidth();
if ( mMaxSize > 0 ) {
if ( mMaxSize > 0 && mMaxSize != bHeight && mMaxSize != bWidth ) {
//createScaledBitmap will create a new bitmap, we need release the old one
Bitmap oldBitmap = bitmap;
if ( bWidth > bHeight ) {
int otherSize = (mMaxSize * bHeight) / bWidth;
bitmap = Bitmap.createScaledBitmap(bitmap, mMaxSize, otherSize, false);
bitmap = Bitmap.createScaledBitmap(oldBitmap, mMaxSize, otherSize, false);
} else {
int otherSize = (mMaxSize * bWidth) / bHeight;
bitmap = Bitmap.createScaledBitmap(bitmap, otherSize, mMaxSize, false);
bitmap = Bitmap.createScaledBitmap(oldBitmap, otherSize, mMaxSize, false);
}
oldBitmap.recycle();
}
mImageView.setImageBitmap(bitmap);

Expand Down
49 changes: 14 additions & 35 deletions davinci/src/main/java/cn/hadcn/davinci/image/base/ImageEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,16 @@ public class ImageEntity {
private boolean isGif;
private int size;

public ImageEntity(Builder builder) {
bitmap = builder.bitmap;
bytes = builder.bytes;
isGif = builder.isGif;
size = builder.size;
public ImageEntity(byte[] bytes) {
this.bytes = bytes;
this.isGif = true;
this.size = bytes.length;
}

public ImageEntity(Bitmap bitmap) {
this.bitmap = bitmap;
this.isGif = false;
this.size = bitmap.getRowBytes();
}

public Bitmap getBitmap() {
Expand All @@ -35,35 +40,9 @@ public int getSize() {
return size;
}

public static class Builder {
private Bitmap bitmap;
private byte[] bytes;
private boolean isGif;
private int size;

public Builder(int size) {
this.size = size;
}

public Builder bitmap(Bitmap bitmap) {
this.bitmap = bitmap;
return this;
}

public Builder bytes(byte[] bytes) {
this.bytes = bytes;
return this;
}

public Builder isGif(boolean isGif) {
this.isGif = isGif;
return this;
}

public ImageEntity build() {
return new ImageEntity(this);
}
@Override
protected void finalize() throws Throwable {
super.finalize();
bitmap.recycle();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -111,15 +111,15 @@ public ImageEntity getBitmap(String key) {
}

private ImageEntity saveToMemory(String key, byte[] data) {
ImageEntity.Builder builder = new ImageEntity.Builder(data.length);
ImageEntity entity;

if ( Util.isGif(data) ) {
builder.isGif(true).bytes(data);
entity = new ImageEntity(data);
} else {
Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length);
builder.isGif(false).bitmap(image);
entity = new ImageEntity(image);
}
ImageEntity entity = builder.build();

mMemoryCache.putMemCache(key, entity);
return entity;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@
* memory cache
* @author 90Chris
*/
public class LruImageCache extends LruCache<String, ImageEntity> {
class LruImageCache extends LruCache<String, ImageEntity> {

public LruImageCache(int maxSize) {
LruImageCache(int maxSize) {
super(maxSize);
}

@Override
protected int sizeOf(String key, ImageEntity value) {
return value.getSize();
return value.getSize() + 1024; //多加1024 bytes,包入整个对象大小,宁多勿少
}

public ImageEntity getMemCache(String url) {
ImageEntity getMemCache(String url) {
return get(url);
}

public void putMemCache(String url, ImageEntity bitmap) {
void putMemCache(String url, ImageEntity bitmap) {
put(url, bitmap);
}
}
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Tue Apr 12 15:58:59 CST 2016
#Tue Nov 01 21:09:25 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

0 comments on commit ee66b4a

Please sign in to comment.