Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 61 additions & 3 deletions library/src/main/java/com/bumptech/glide/Glide.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.bumptech.glide;

import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks2;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.MessageQueue.IdleHandler;
import android.util.Log;
import android.view.View;
Expand Down Expand Up @@ -44,13 +46,14 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

/**
* A singleton to present a simple static interface for building requests with {@link
* RequestBuilder} and maintaining an {@link Engine}, {@link BitmapPool}, {@link
* com.bumptech.glide.load.engine.cache.DiskCache} and {@link MemoryCache}.
*/
public class Glide implements ComponentCallbacks2 {
public class Glide implements ComponentCallbacks2, Application.ActivityLifecycleCallbacks {
private static final String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
private static final String DESTROYED_ACTIVITY_WARNING =
"You cannot start a load on a not yet attached View or a Fragment where getActivity() "
Expand Down Expand Up @@ -205,7 +208,9 @@ public static void enableHardwareBitmaps() {
public static void tearDown() {
synchronized (Glide.class) {
if (glide != null) {
glide.getContext().getApplicationContext().unregisterComponentCallbacks(glide);
Application application = (Application) glide.getContext().getApplicationContext();
application.unregisterComponentCallbacks(glide);
application.unregisterActivityLifecycleCallbacks(glide);
glide.engine.shutdown();
}
glide = null;
Expand All @@ -224,7 +229,7 @@ private static void initializeGlide(
@NonNull Context context,
@NonNull GlideBuilder builder,
@Nullable GeneratedAppGlideModule annotationGeneratedModule) {
Context applicationContext = context.getApplicationContext();
Application applicationContext = (Application) context.getApplicationContext();
List<GlideModule> manifestModules = Collections.emptyList();
if (annotationGeneratedModule == null || annotationGeneratedModule.isManifestParsingEnabled()) {
manifestModules = new ManifestParser(applicationContext).parse();
Expand Down Expand Up @@ -265,6 +270,7 @@ private static void initializeGlide(
}
Glide glide = builder.build(applicationContext, manifestModules, annotationGeneratedModule);
applicationContext.registerComponentCallbacks(glide);
applicationContext.registerActivityLifecycleCallbacks(glide);
Glide.glide = glide;
}

Expand Down Expand Up @@ -446,6 +452,8 @@ public void clearMemory() {
arrayPool.clearMemory();
}

private AtomicBoolean inBackground = new AtomicBoolean(false);

/**
* Clears some memory with the exact amount depending on the given level.
*
Expand Down Expand Up @@ -678,6 +686,12 @@ void unregisterRequestManager(RequestManager requestManager) {
@Override
public void onTrimMemory(int level) {
trimMemory(level);
// when level is TRIM_MEMORY_UI_HIDDEN or higher, it indicates that the app is
// in the background, we limit the memory usage to ZERO.
if (level >= TRIM_MEMORY_UI_HIDDEN) {
inBackground.set(true);
setMemoryCategory(MemoryCategory.ZERO);
}
}

@Override
Expand All @@ -697,4 +711,48 @@ public interface RequestOptionsFactory {
@NonNull
RequestOptions build();
}

/**
* Any activity that is started or resumed indicates that the app is no longer in the background,
* and we should restore the memory usage to normal.
*/
@Override
public void onActivityStarted(Activity activity) {
if (inBackground.getAndSet(false)) {
setMemoryCategory(MemoryCategory.NORMAL);
}
}

@Override
public void onActivityResumed(Activity activity) {
boolean wasInBackground = inBackground.getAndSet(false);
if (inBackground.getAndSet(false)) {
setMemoryCategory(MemoryCategory.NORMAL);
}
}

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
// Do nothing.
}

@Override
public void onActivityDestroyed(Activity activity) {
// Do nothing.
}

@Override
public void onActivityStopped(Activity activity) {
// Do nothing.
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
// Do nothing.
}

@Override
public void onActivityPaused(Activity activity) {
// Do nothing.
}
}
2 changes: 2 additions & 0 deletions library/src/main/java/com/bumptech/glide/MemoryCategory.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

/** An enum for dynamically modifying the amount of memory Glide is able to use. */
public enum MemoryCategory {
/** Tells Glide's memory cache and bitmap pool to use no memory. */
ZERO(0f),
/**
* Tells Glide's memory cache and bitmap pool to use at most half of their initial maximum size.
*/
Expand Down
Loading