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

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

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

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

Я тоже не могу этого сделать:

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 обременительно, также ему не хватало модульности, и другие классы не могут использовать этот класс без создания экземпляра объекта.

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

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

Zeeshan Shabbir 08.04.2018 09:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
325
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

class MyApp extends Application {
    public final Constants constants;

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

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

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

Другие вопросы по теме