Могу ли я использовать getFilesDir вне потока пользовательского интерфейса

avatar
157 239n
8 апреля 2018 в 07:17
411
1
0

Я использую Android Studio и хочу знать каталог приложения в любом месте (имеется в виду каждый нестатический класс).

Дело в том, что я создаю класс под названием «Константы» для суммирования произвольных констант в моем приложении. Все мои константы в настоящее время статичны и общедоступны, за исключением констант, относящихся к каталогу приложения. Я также реализую Serializable для хранения файла констант внутри некоторого файла. Я буду экспортировать и импортировать константы статическими методами внутри класса Constants. На самом деле все статично :))

Я знаю, что getFilesDir() в классе Context не является статическим, то есть я не могу вызвать что-то вроде MainActivity.getFilesDir().getAbsolutePath(), где MainActivity расширяет действие, расширяет контекст.

Я тоже не могу сделать что-то подобное:

public transient static MainActivity someActivity = new MainActivity();
public transient static String parentAbsolutePath = someActivity.getFilesDir().getAbsolutePath();

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

Я знаю, что есть простой способ сделать это, а именно передать MainActivity в конструктор, например:

class Constants implements Serializable {
    public transient static MainActivity mainActivity;
    public transient static String parentAbsolutePath;

    Constants(MainActivity mainActivity){
        this.mainActivity = mainActivity;
        this.parentAbsolutePath = mainActivity.getFilesDir().getAbsolutePath();
    }
}

Однако создание экземпляра Constants constants = new Constants(this) в MainActivity затруднительно, также ему не хватало модульности, и другие классы не могли использовать класс без создания экземпляра объекта.

Итак, мой вопрос: есть ли способ получить доступ к каталогу приложения внутри класса Constants без необходимости передачи контекстно-расширенного объекта?

Источник
Zeeshan Shabbir
8 апреля 2018 в 07:23
0

Для этого можно использовать кинжал. Посмотрите вокруг для инъекции зависимостей. Это поможет вам.

Ответы (1)

avatar
greywolf82
8 апреля 2018 в 07:51
2

Короткий ответ: нет, нельзя. Альтернативный обходной путь, используйте класс Application. Пример:

class MyApp extends Application {
    public final Constants constants;

    public void onCreate() {
        constants = new Constants(this);
    }
}

и ваш манифест:

<application
android:name="MyApp">
<activity></activity>
</application>