Ich habe ComponentCallbacks2 implementiert und onTrimMemory wird nie aufgerufen. Ich versuche, Speicher mithilfe der Anwendungsklasse und meines benutzerdefinierten Lebenszyklus zu verwalten. Jede Hilfe dabei ist erwünscht.onTrimMemory() von ComponentCallbacks2 ruft nicht
public class MemoryManager implements ComponentCallbacks2 {
private static List<MemoryInfo> memInfoList = new ArrayList<>();
public interface MemoryInfo {
void releaseMemory();
}
public static void registerMemoryListener(MemoryInfo memoryInfo) {
memInfoList.add(memoryInfo);
}
public static void unregisterMemoryListener(MemoryInfo memoryInfo) {
memInfoList.remove(memoryInfo);
}
@Override
public void onTrimMemory(int level) {
Log.i("TEST", "onTrimMemory called"); // does not get called
switch (level) {
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
try {
for (int i = memInfoList.size() - 1; i >= 0; i--) {
try {
memInfoList.get(i).releaseMemory(); // is this correct implementation?
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
break;
case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN:
// I added logs here, it does not get reached
break;
default:
break;
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// do nothing
}
@Override
public void onLowMemory() {
// will log when there is log memory
}
Ich habe eine Anwendungsklasse, die meine Schnittstellen von MemoryManager-Klasse aufruft.
public class TestApplication extends Application implements ActivityLifecycleCallback, MemoryManager.MemoryInfo {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Activity activity) {
Log.i(TAG, "onStart() called :: " + activity.getLocalClassName());
}
@Override
public void onResume(Activity activity) {
Log.i(TAG, "onResume called :: " + activity.getLocalClassName());
MemoryManager.registerMemoryListener(this);
}
@Override
public void onPause(Activity activity) {
Log.i(TAG, "onPause called :: " + activity.getLocalClassName());
}
@Override
public void onStop(Activity activity) {
Log.i(TAG, "onStop called :: " + activity.getLocalClassName());
MemoryManager.unregisterMemoryListener(this);
}
@Override
public void onDestroy(Activity activity) {
Log.i(TAG, "onDestroy called :: " + activity.getLocalClassName());
}
@Override
public void releaseMemory() {
Log.i(TAG, "releaseMemory() called");
}
Meine Hauptaktivität hält nur den Überblick über den gesamten Lebenszyklus. Das funktioniert gut. Meine Lebenszyklusmethoden sehen wie folgt aus:
@Override
protected void onDestroy() {
// register lifecycle
application.onDestroy(activity);
super.onDestroy();
}
@Override
protected void onPause() {
// register lifecycle
application.onPause(activity);
super.onPause();
}
@Override
protected void onResume() {
// register lifecycle
application.onResume(activity);
super.onResume();
}
@Override
protected void onStart() {
// register lifecycle
application.onStart(activity);
super.onStart();
}
Was fehlt mir, um onTrimMemory() aufzurufen ??
AFAIK, 'onTrimMemory' wird nur bei Bedarf aufgerufen; und du solltest prüfen ob gt/lt 'level', nicht eq; Es ist auch merkwürdig, App-Lifecycle-Methoden von einer Aktivität aus aufzurufen. – muratgu