2013-04-03 11 views
5

Szukałem wszędzie na odpowiedź i za każdym razem, gdy widzę kogoś innego użyć metody:Dlaczego nie mogę używać getFilesDir(); w statycznym kontekście?

getFilesDir(); 

Ale gdy próbuję i używać tej metody w jakikolwiek sposób, w szczególności:

File myFile = new File (getFilesDir();, filename); 

Eclipse tylko mówi: "Nie można utworzyć statycznego odwołania do niestatycznej metody getFilesDir z tye ContextWrapper"

Próbuję użyć go, aby uzyskać wewnętrzny katalog, aby zapisać plik dla mojej aplikacji.

Dzięki!

Odpowiedz

3

To dlatego, że w metodzie statycznej nie masz obiektu klasy, a getFilesDir nie jest metodą statyczną, co oznacza, że ​​będzie dostępny tylko za pośrednictwem obiektu Kontekst klas.

Możesz więc zapisać referencję do obiektu w zmiennej statycznej klasy, a następnie użyć jej w statycznej metodzie.

na przykład:

static YourContextClass obj; 

static void method(){ 
    File myFile = new File (obj.getFilesDir(), filename); 
} 

również trzeba będzie przechowywać odwołanie do obiektu w onCreateMethod()

obj = this; 

Najlepszym sposobem osiągnięcia tego celu jest

static void method(YourContextClass obj){ 
     File myFile = new File (obj.getFilesDir(), filename); 
} 
+1

Hmm, teraz daje wyjątek NullPointerException, gdy jest wywoływany? – Jackles

+0

Zły pomysł ... skończysz z Aktywnym wyciekiem ... – Selvin

+0

To znaczy, że został skompilowany, ale zawiesza się, gdy jest wywoływany. – Jackles

1

Będę mówić o tym, co mi się przydarzyło. Zajmuję się tworzeniem plików systemu log, więc stworzyłem nową klasę i chciałem, aby była dla wszystkich moich aplikacji i mając wiele instancji tej klasy robiących różne dzienniki. Tak więc chcę utworzyć obiekty chronione lub publiczne mojej klasy na klasie aplikacji, która jest podobna do klasy singleton.

więc miałem coś takiego:

 public class MyApp extends Application { 
     protected LogApp logApp = new LogApp(getFilesDir()); 

gdy zadzwoniłem go z mojego główne klasy, aby uzyskać pliki lista na przykład:

 public class LogApp { 
     public File dirFiles; 

     //file parameter can't be null, the app will crash 
     public LogApp(File file){ 
      dirFiles = file; 
     } 

     public File[] getListFiles(){ 
      return dirFiles.listFiles() 
     } 

     public class MainActivity extends AppCompatActivity { 
     protected void onCreate(Bundle savedInstanceState) { 
      MyApp myApp = (MyApp)getApplicationContext(); 
      File file[] = myApp.logApp.getListFiles(); 
     } 

Zostało dostaniem mi błąd nullPointException. Rozwiązanie w tym przypadku było tak łatwe, że czułem się jednocześnie stuoidalnie i dumnie.

Nie mogłem zadzwonić, aby pobraćFilesDir w przestrzeni deklaracji MyApp, ponieważ w tym momencie nie ma kontekstu, aby uzyskać ten Dir. Kolejność wykonywania w aplikacji dla systemu Android to: Aplikacja -> Aktywność. Jak to jest powiedziane w pliku manifestu.

Rozwiązanie? Utworzyć mój obiekt w onCreate przypadku mojej klasie MojaApl, wygląda to tak:

public class MyApp extends Application { 
     protected LogApp logApp; 

     void onCreate(){ 
      logApp = new LogApp(getFilesDir()); 

Więc teraz mogę używać go w moim główne klasy w ten sam sposób, w jaki zrobił to, ponieważ istnieje wystąpienie mojego główną działalność, która rozciąga się w ostatnie wystąpienie z klasy kontekstu.

Może się mylę z objaśnieniem i nie jest to, co tak naprawdę dzieje się w znaczeniu terminologii i jak działa Android.Jeśli ktoś rozumie lepiej ode mnie, dlaczego to działa, zapraszam do wyjaśnienia naszych wątpliwości.

Mam nadzieję, że to ci pomoże.

Powiązane problemy