2016-06-24 9 views
0

Meine Tätigkeit verwendet einen Adapter, der einen Kontext benötigtWie wird die Anwendung anstelle des Aktivitätskontexts in einem AndroidAnnotations-powered Adapter übergeben?

@EActivity 
public class MyActivity extends Activity { 

    @Bean 
    MyAdapter adapter; 

} 

Der Adapter selbst:

@EBean 
public class MyAdapter extends Adapter { 

    @RootContext 
    Context context; 

} 

Whn ich die erzeugte Aktivität öffnen, sehe ich:

adapter = MyAdapter_.getInstance_(getActivity()); 

Der Kontext Aktivität leckt Speicher. Ich möchte es in Application Context ändern Ich könnte das mit einem Setter tun, nehme ich an, aber ich muss es irgendwie Zeit, so kann ich AndroidAnnotations stattdessen Application Context übergeben?

+0

* Der Aktivitätskontext verliert Speicher. * Wenn Sie in Ihrem Adapter keine seltsamen Dinge tun, sollte dies nicht der Fall sein. Wenn der Kontext leckt, bedeutet dies, dass Adapter länger lebt Aktivität = Seltsame Sachen ... – Selvin

+0

Das ist wahr, und ich werde es untersuchen, aber meine Frage bleibt - wie übergebe ich den Anwendungskontext an einen Adapter mit AndroidAnnotations –

Antwort

1

Sie können die App Context mit @RootContext passieren, aber man kann mit @App das Anwendungsobjekt injizieren:

@EApplication 
public class MyApp extends Application { 
    ... 
} 
// do not forget to register MyApp_ in the manifest 

@App 
MyApp myApp; 

Dann können Sie verwenden, die als die App Context.

+0

I habe gerade herausgefunden, dass mein generierter Adapter einen generierten Konstruktor hat, der die Aktivität trotzdem akzeptiert. Und das Leck tritt auf, weil eine annotierte Methode "@ Background" im Hintergrund ausgeführt wird, wenn die Aktivität beendet wird. Nun, wenn ich Macht über diesen Konstruktor hätte, hätte ich 'WeakReference ' anstelle der Aktivität selbst übergeben, aber ich nicht :( –

+0

Aber warum läufst du die Methode? Du solltest eine Endbedingung dafür hinzufügen. BTW, Es gibt ['@ IgnoreWhen'] (https://github.com/excilys/androidannotations/wiki/IgnoredWhenDetached#ignorewhen), aber für Fragmente – WonderCsabo

+0

Die Methode lädt Daten aus der DB, um sie im Adapter anzuzeigen, manchmal aber auch wenn der Benutzer klickt zu schnell weg, die Aktivität wird beendet und die Methode läuft weiter. wird überprüft, was '@ IgnoreWhen' tut, danke –