2016-07-22 21 views
1

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 ??

+1

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

Antwort

4

Wenn Sie sich the documentation for ComponentCallbacks2 ansehen, werden Sie feststellen, dass es bereits in Klassen wie Application und Activity implementiert ist. Für diese Komponenten können Sie also einfach onTrimMemory() überschreiben und es wird entsprechend aufgerufen.

Dies sollte Ihnen erlauben, fast den gesamten Code aus Ihrer Frage zu löschen.

+0

Ich verstehe. Ja, das macht die Dinge einfacher. Vielen Dank! – portfoliobuilder

+1

@portfolioBuilder die 'onTrimMemory()' in 'Application' wird immer noch nicht für mich aufgerufen. Was hat für dich funktioniert? Der eine von 'Activity' wird getroffen – Boy

2

Sie sollten ComponentCallbacks2 nicht implementieren, wenn onTrimMemory() verwenden möchten, sollten Sie nur onTrimMemory() in Ihrer Anwendungsklasse außer Kraft setzen. Wenn Sie jedoch in Ihrer benutzerdefinierten Klasse wirklich alles richtig machen möchten, verwenden Sie registerComponentCallbacks(ComponentCallbacks callback)

Sie können registerActivityLifecycleCallbacks(callback); verwenden, wenn Sie den Lebenszyklus Ihrer Aktivitäten überwachen möchten.

Wo Callback-Application-Klasse ist die Application.ActivityLifecycleCallbacks

Zum Beispiel implementiert, können Sie es in OnCreate Methode Ihrer Anwendungsklasse registrieren.