Android Как прочитать актив вне основного действия

Мне нужно иметь возможность вызывать readAsset из-за пределов основного действия моего приложения. Я слышал, как люди упоминали о необходимости передачи контекста, но формулировка была очень расплывчатой. Может ли кто-нибудь описать шаги, необходимые для добавления возможности вызова readAsset в существующий класс, который не является основным действием? Создание общедоступной функции в основном действии и вызов других, которые не будут работать, поскольку место, в которое мне нужно добавить readAsset, находится в отдельном потоке.


person corbin    schedule 08.11.2010    source источник
comment
Каковы ваши опасения по поводу передачи Context классам, которые будут зависеть от функциональности?   -  person Quintin Robinson    schedule 08.11.2010
comment
У меня нет, но я не нашел пример того, что мне нужно сделать. Я предполагаю, что это просто, но нахожу только расплывчатые описания. Скажем, у меня есть основная деятельность и какой-то другой класс (в данном случае в отдельном потоке). Что нужно добавить в другой класс, чтобы мои активы были доступны мне там.   -  person corbin    schedule 08.11.2010


Ответы (3)


public class NonActivity {
    public void doStuff(Context c) {
        //read from assets
        c.getAssets();
        //use assets however
    }
}

Не уверен, что вы спрашиваете, но, возможно, что-то вроде этого? Просто добавьте к существующему классу и используйте контекст для извлечения активов. В своей деятельности вызовите метод следующим образом:

public class MyActivity extends Activity {
  public void OnCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    NonActivity n = new NonActivity();
    n.doStuff(this);
  }
}
person danh32    schedule 08.11.2010
comment
Это похоже на то, о чем я просил. Я попробую это сегодня вечером. Спасибо! - person corbin; 08.11.2010
comment
Это было оно. Думал будет легко. - person corbin; 11.11.2010
comment
будьте осторожны с передачей контекста вашей деятельности. Если вы передаете контекст потоку, который переживает активность, у вас может быть утечка памяти. - person MikeIsrael; 31.12.2013
comment
На самом деле это не имеет смысла и не отвечает на исходный вопрос. Следует задать правильный вопрос Как получить доступ к активам/ресурсам без какого-либо контекста. Предположим, что файл свойств app.properties содержит isLogEnabled. Как вы получаете доступ к такому глобальному свойству, не передавая контекст каждому классу, который что-то регистрирует. - person MG Developer; 13.07.2017
comment
@MGDeveloper, однако, это совершенно другой вопрос. - person danh32; 13.07.2017

Для чтения ресурсов вам потребуется Context, но вы не должны t нужно использовать Activity вместо Context; вместо этого вы можете использовать объект Application.

Контекст Android без активности? И другое программирование без активности?

public class MyApplication extends Application {
    private static MyApplication instance;

    public MyApplication() {
        instance = this;
    }

    public static MyApplication getInstance() {
         return instance;
    }
}

Сначала вам нужно добавить атрибут android:name к элементу <application> в AndroidManifest.xml:

 <application android:name="com.example.MyApplication" ... />

Теперь вы можете вызывать MyApplication.getInstance().getAssets() статически из любого места.

В качестве альтернативы вы можете использовать внедрение зависимостей Dagger для внедрения Application непосредственно в ваш объект. (Вставка контекста Application немного сложна. См. Dagger 2, внедряющий контекст Android и эта проблема зарегистрирована в репозитории Danger github.)

person Dan Fabulich    schedule 20.04.2019

Обратите внимание, что все обращения к файловой системе должны выполняться вне основного потока, поэтому вы не должны читать их во время onCreate(). Вместо этого вы должны использовать другой поток, такой как предоставленный AysncTask.

person Tom O'Neill    schedule 23.06.2017