Вы не можете вернуть то, что еще не загружено. Firestore загружает данные asynchronously
, так как для этого может потребоваться некоторое время. В зависимости от скорости соединения и состояния, может потребоваться от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные будут доступны. Если вы хотите передать объект settings
другому методу, просто вызовите этот метод внутри метода onSuccess()
и передайте этот объект в качестве аргумента. Таким образом, быстрое исправление будет следующим:
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
yourMethod(settings);
}
Еще одно замечание: вам не нужно устанавливать эти значения для объекта, который уже имеет их. Вы уже получаете данные из базы данных в качестве объекта.
blockquote>Так что помните, что метод
onSuccess()
имеет асинхронное поведение, а это означает, что вызывается еще до того, как вы получите данные из своего база данных. Если вы хотите использовать объектsettings
вне этого метода, вам нужно создать свой собственныйcallback
. Для этого сначала нужно создать такой интерфейс:public interface MyCallback { void onCallback(UserAccountSettings settings); }
Затем вам нужно создать метод, который фактически получает данные из базы данных. Этот метод должен выглядеть так:
public void readData(MyCallback myCallback) { DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID); mSettings.get().addOnSuccessListener(new OnSuccessListener
() { @Override public void onSuccess(DocumentSnapshot documentSnapshot) { UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class); myCallback.onCallback(settings); } }); } . В конце просто просто вызовите метод
readData()
и передайте экземпляр интерфейсаMyCallback
в качестве аргумента везде, где вам это нужно:readData(new MyCallback() { @Override public void onCallback(UserAccountSettings settings) { Log.d("TAG", settings.getDisplay_name()); } });
Это единственный способ, которым вы можете использовать этот объект класса
UserAccountSettings
вне методаonSuccess()
. Для получения дополнительной информации вы также можете посмотреть видео .
В итоге я использовал это:
<defs>
<style type="text/css">
<![CDATA[
@font-face {
font-family: "Open Sans";
src: local("Open Sans"), /* IE */
local("OpenSans"),
url("data:application/vnd.ms-fontobject;charset=utf-8;base64,{$fontEot}") format('embedded-opentype'),
url("data:application/x-font-woff;charset=utf-8;base64,{$fontWoff}") format('woff'),
url('https://example.com/OpenSans-Regular.ttf') format('truetype');
}
]]>
</style>
Поддержка:
+------------+--------+-------+-------+-----------+
| | Win XP | Win 7 | iOS 6 | OS X 10.9 |
+------------+--------+-------+-------+-----------+
| IE 8 | no | no | | |
| IE 9 | | yes | | |
| IE 10 | | yes | | |
| IE 11 | | yes | | |
| Safari 4 | | yes | | |
| Safari 5.0 | | yes | | |
| Safari 5.1 | | no | | |
| Safari 7 | | no | | yes |
| Safari iOS | | | yes | |
| FF 3.6 | no | no | | |
| FF 4 | yes | yes | | |
| FF 27 | yes | yes | | yes |
| Chrome 14 | yes | yes | | |
| Chrome 33 | yes | yes | | yes |
| Opera 10.6 | yes | yes | | |
| Opera 19 | yes | | | |
+------------+--------+-------+-------+-----------+
Per http://gs.statcounter.com/#browser_version_partially_combined-ww- ежемесячно-201310-201312-бар это составляет общую поддержку где-то около 85%.
Единственное, что действительно беспокоит, - это то, что Safari 5.1 вообще не отображает текст. Я должен был сделать Safari только резерв в объявлении css:
/* Win Safari fallback */
@media screen and (-webkit-min-device-pixel-ratio:0) {
/* Safari only */
::i-block-chrome,text {
font-family: 'Verdana';
}
}
В любом случае, вложение шрифта просто кажется неправильным, поскольку файлы огромны.
В Firefox, по крайней мере, изображения должны быть полностью автономными, т.е. все в одном файле для соображений неприкосновенности .
Если вы хотите, чтобы шрифты работали, вам придется base64 закодирует их и вставляет их как URL-адреса данных в файл SVG, т. е.
@font-face {
font-family: 'Open Sans';
src: url("data:application/x-font-ttf;base64,[base-encoded font here]");
}