Мне нужно иметь возможность вызывать readAsset из-за пределов основного действия моего приложения. Я слышал, как люди упоминали о необходимости передачи контекста, но формулировка была очень расплывчатой. Может ли кто-нибудь описать шаги, необходимые для добавления возможности вызова readAsset в существующий класс, который не является основным действием? Создание общедоступной функции в основном действии и вызов других, которые не будут работать, поскольку место, в которое мне нужно добавить readAsset, находится в отдельном потоке.
Android Как прочитать актив вне основного действия
Ответы (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);
}
}
Для чтения ресурсов вам потребуется 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.)
Обратите внимание, что все обращения к файловой системе должны выполняться вне основного потока, поэтому вы не должны читать их во время onCreate(). Вместо этого вы должны использовать другой поток, такой как предоставленный AysncTask.
Context
классам, которые будут зависеть от функциональности? - person Quintin Robinson   schedule 08.11.2010