2016-03-05 13 views
5

Jedną z najfajniejszych funkcji obsługi powiązań danych Androida jest to, że generuje również pola dla zestawu Wyświetl z identyfikatorami. To upraszcza bazę kodową, ponieważ nie są wymagane żadne połączenia ani połączenia.Android leniwy powiązanie danych możliwe?

Problem polega na tym, że instancję powiązania można odzyskać tylko za pomocą wywołania bind(), które zwykle planuje wiązanie. Jest to złe, gdy dane są odbierane asynchronicznie i zwykle zostaje wyrzucony NullPointerException.

Czy można pobrać instancję powiązania z polami widoku minus faktyczny proces powiązania danych?

Stack Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference 
     at com.app.android.databinding.ActivityRestaurantDetailsBinding.executeBindings(ActivityRestaurantDetailsBinding.java:381) 
     at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:350) 
     at android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:167) 
     at android.databinding.ViewDataBinding$5.onViewAttachedToWindow(ViewDataBinding.java:137) 
     at android.view.View.dispatchAttachedToWindow(View.java:14525) 

Odpowiedz

3

To nie wydaje się, aby wiązanie sensie dane zignoruje zmienne zerowe zatem nie zerowy wskaźnik powinien zostać wyrzucone, to, moim zdaniem, jeden z najbardziej promowanych funkcji . Jeśli trzeba zmodyfikować zmienne po wywołań asynchronicznych etc można po prostu użyć dataBinding.executePendingBindings()

Od the docs

Wygenerowany klasy wiążąca będzie mieć setter i getter dla każdej z opisanych zmiennych. Zmienne zajmie domyślne wartości Java aż seter nazywa - null dla typów referencyjnych, 0 dla int, false dla wartości logicznej itd

i

wygenerowanych danych Kod wiązania automatycznie sprawdza null i unikanie wyjątków wskaźnika pustego. Na przykład w wyrażeniu @ {user.name}, jeśli użytkownik ma wartość null, nazwa użytkownika zostanie przypisana jego wartość domyślna (null). Jeśli odwoływałeś się do user.age, gdzie wiek jest int, wtedy domyślnie byłby 0.

+0

Spodziewałem się tego samego. Po sprawdzeniu wygenerowanego kodu, było wiele sprawdzeń zerowych, ale nie było to prawdą dla tego typu boolowskiego. Czy to brzmi jak błąd? – razzledazzle

+0

To samo dla 'android: text =" @ {DateFormatter.format (item.orderDate)} "'. Powoduje to wywołanie przez NPE przyczyny 'DateFormatter.format (null)'. – drindt

+1

Po korzystaniu z databinding w ciągu ostatnich kilku miesięcy wydaje się, że nadal istnieje wiele problemów z zerowym sprawdzaniem, co jest bardzo rozczarowujące. Najbardziej znaną przyczyną jest boolean type @ @ zzazazzle –

Powiązane problemy