2016-09-30 3 views
2

In meinem Projekt habe ich diese Situation. Dies ist ein Teil meines MainActivity, ich das Objekt initialisiert helperClass mit dem applicationContext und machte es statisch, weil ich es zu benutzen, in der OnClickListener einer Taste:Wie verwende ich eine Klasse mit einem Kontextargument in einem statischen Kontext, ohne ein Speicherleck zu verursachen?

public class MainActivity { 
    public static HelperClass helperClass; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     helperClass = new HelperClass(getApplicationContext()); 

     {...} 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       helperClass.doSomething(); 
      } 
     }); 
    } 
} 

Dies ist ein Teil der Hilfsklasse ist, ich brauche den Kontext, weil ich einige Daten in der App-Speicher zu speichern haben:

public class HelperClass{ 
    private Context context; 

    public HelperClass(Context context) { 
     this.context = context; 
    } 

    public void doSomething() { 
     File file = new File(context.getFilesDir(), "name"); 
     {...} 
    } 
} 

nun diesen Code funktioniert, aber wenn ich helperClass erklären statisch gibt es eine Warnung sagen, dies ist ein Speicherleck; Ich habe versucht, den Kontext aus der HelperClass zu entfernen, aber ich konnte den Kontext nicht aus der Klasse abrufen; Ich habe auch versucht, die statische Deklaration zu entfernen, aber ich brauche es, weil der OnClickListener ein statischer Kontext ist.

Ich lese here, dass ich ApplicationContext verwenden kann, es ist in Ordnung, aber es ist ein alter Artikel.

Gibt es eine bessere Lösung?

Antwort

3

Sie müssen kein Feld statisch machen, um es im Listener zu verwenden. Darüber hinaus sollten Sie nicht, wie Sie richtig gesagt, dass es zu einem Speicherverlust führen kann :-) Entfernen Sie einfach die statische Schlüsselwort, führen Sie den Code und es funktioniert ^^

+0

Wenn ich das static-Schlüsselwort entfernt, heißt es, dass nicht-statische FeldhelferClass nicht aus einem statischen Kontext verwiesen werden kann. – Darcar90

+0

@ Darcar90 von dem Code, den Sie veröffentlicht haben, dies ist die richtige Lösung und sollte funktionieren. Machst du irgendwelche anderen statischen Referenzen, die du uns nicht gezeigt hast? – brandall

+0

@ Darcar90 bitte posten Sie den Code, der diesen Fehler verursacht –

1

, wenn das Entfernen der statischen Deklaration Sie verhindert aus Speicherlecks können Sie die statische Deklaration und Zugriffshelfer-Klasse von onClick() -Methode wie folgt entfernen.

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MainActivity.this.helperClass.doSomething(); 
     } 
    }); 
+0

Ich habe das auch versucht, es heißt, MainActivity.this ist nicht statisch und kann nicht aus einem statischen Kontext referenziert werden. – Darcar90

+0

haben Sie statische Schlüsselwörter aus der Helper-Klasse entfernt? –

+0

Ja, ich habe es entfernt. – Darcar90

0

Sie können den Kontext des helperClass entfernen und den Kontext durch die Methode doSomething (Context) senden Ihr Problem zu vermeiden.

Wenn Sie den Kontext auf diese Weise senden, müssen Sie ihn nicht als globale Variable verwenden.

public class HelperClass{ 

    public HelperClass() { 
    } 

    public void doSomething(Context context) { 
     File file = new File(context.getFilesDir(), "name"); 
     {...} 
    } 
} 
Verwandte Themen