2013-04-03 4 views
5

Я посмотрел везде в ответ и каждый раз, когда я вижу, кто-то использовать метод:Почему я не могу использовать getFilesDir(); в статическом контексте?

getFilesDir(); 

Но когда я пытаюсь использовать этот метод в любом случае, особенно:

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

Eclipse, просто говорит: «Невозможно сделать статическую ссылку на нестатический метод getFilesDir из tye ContextWrapper»

Я пытаюсь использовать его, чтобы получить внутреннюю директорию для записи файла для моего приложения.

Спасибо!

ответ

3

Это потому, что в статическом методе у вас нет объекта класса, а getFilesDir не является статическим методом, что означает, что он будет доступен только через объект класса Context.

Итак, что вы можете сделать, это сохранить ссылку на объект в статической переменной вашего класса, а затем использовать его в своем статическом методе.

, например:

static YourContextClass obj; 

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

также вы должны будете хранить ссылку на объект в вашем onCreateMethod()

obj = this; 

Самый лучший способ для достижения этой цели является

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

Хм, Теперь это дает исключение NullPointerException, когда оно называется? – Jackles

+0

Плохая идея ... вы закончите с Activity leak ... – Selvin

+0

То есть, теперь она скомпилирована, но она вылетает, когда она вызывается. – Jackles

1

Я собираюсь рассказать о том, что случилось со мной. Я разрабатываю системные файлы журнала, поэтому я создал новый класс, и я хотел, чтобы это было для всего моего приложения и имело много экземпляров этого класса, делающих разные журналы. Поэтому я должен создать защищенные или общедоступные объекты моего класса в классе приложения, который похож на одноэлементный класс.

Так что я что-то вроде этого:

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

Когда я назвал его от моего основного класса, чтобы получить файлы списка, например:

 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(); 
     } 

Это расстраивало меня ошибка nullPointException. Решение в этом случае было настолько легким, что я чувствовал себя одновременно и самоуверенным.

Я не мог позвонить в getFilesDir в пространстве объявлений MyApp, потому что в этот момент нет контекста для получения этого Dir. Порядок выполнения в Android-приложении: Application -> Activity. Как это сказано в файле манифеста.

Решение? Создать свой объект в OnCreate случая моего MyApp класса, это выглядит следующим образом:

public class MyApp extends Application { 
     protected LogApp logApp; 

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

Так что теперь я могу использовать его в своем основном классе таким же образом, я сделал это потому, что существует экземпляр моего MainActivity, который проходит в последний экземпляр из класса контекста.

Возможно, я ошибаюсь в пояснениях, и это не то, что действительно происходит в терминах терминологии и как работает андроид.Если кто-то лучше меня поймет, почему это работает, я приглашаю вас прояснить свои сомнения.

Надеюсь, это поможет вам.

Смежные вопросы