2015-06-16 10 views
8

Chiunque utilizzi la libreria di database di Android (com.android.databinding: dataBinder) può commentare questa libreria beta? Nel sito per sviluppatori Android si dice "Potrebbe contenere bug e potrebbe non funzionare per il tuo caso d'uso, quindi usalo a tuo rischio.", Quindi eventuali problemi o bug o bug significativi a riguardo?Eventuali bug o problemi significativi con Android Databinding Library?

+0

magirtopcu, puoi chiarire che cosa rende un bug significativo per te? –

risposta

5

Ho giocato con la libreria di database da un paio di settimane ed è sorprendentemente robusto considerando che è la prima versione.

L'unico bug che ho trovato finora ha una soluzione alternativa. Lo spiego qui sotto.

Quando si utilizza un <include> tag nel file di layout associazione dati (un file di layout che ora utilizza il tag <layout> come la radice), il codice generato crea un legame per il genitore del tag <include> ViewGroup.

Quando si gonfia la vista utilizzando DataBindingUtil, l'applicazione si interromperà con a quando tenta di risolvere il ViewGroup. Sembra che ci sia un comportamento diverso tra il generatore di codice e la logica di binding runtime.

Problemi Esempio

Ecco un esempio di layout con il problema di cui sopra.

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
    </data> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <!-- This include causes no issues --> 
     <include 
      layout="@layout/view_content"/> 

     <ScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

      <!-- This include however causes the data binding to crash on the ScrollView --> 
      <include 
       layout="@layout/view_content"/> 

     </ScrollView> 

    </RelativeLayout> 
</layout> 

Ed ecco il layout incluso.

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
    </data> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Test"/> 
</layout> 

Quando si tenta di utilizzare DataBindingUtil.setContentView si verifica il seguente arresto anomalo.

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ScrollView.setTag(java.lang.Object)' on a null object reference 

Solution (Soluzione)

La soluzione temporanea che ho trovato è quello di associare un valore fittizio al genitore del tag <include> ViewGroup. Ciò consente al databinder di trovare il ViewGroup in fase di runtime, evitando il crash.

Ecco un esempio di correzione in azione:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bind="http://schemas.android.com/apk/res-auto"> 

    <data> 
     <variable 
      name="viewModel" 
      type="com.example.ViewModel"/> 
    </data> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <!-- This include causes no issues --> 
     <include 
      layout="@layout/view_content"/> 

     <ScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      bind:visibility="@{viewModel.dummyVisibility}"> 

      <!-- This include will not cause a problem now that the ScrollView has a value being bound --> 
      <include 
       layout="@layout/view_content"/> 

     </ScrollView> 

    </RelativeLayout> 
</layout> 

E qui è il modello di visione molto semplice:

package com.example; 

import android.databinding.BaseObservable; 
import android.databinding.Bindable; 
import android.view.View; 

public class ViewModel extends BaseObservable { 
    @Bindable 
    public int getDummyVisibility() { 
     // TODO: This is a work around. Currently data binding crashes on certain views if they don't have binding. 
     return View.VISIBLE; 
    } 
} 

Speriamo che questo è stato risolto in futuro e questa soluzione non sarà necessario!

Modifica

ho trovato un altro problema per quanto riguarda le schede personalizzate vincolanti che ho sollevato in https://code.google.com/p/android-developer-preview/issues/detail?id=2421

+0

hai segnalato questo su b.android.com? Abbiamo effettivamente corretto un bug simile quando gonfiamo un raccoglitore dati usando 'attachToRoot = true'. Non sono sicuro se questo è causato da esso però, vorrei essere sicuro che sia stato corretto. (creerà un bug report interno ma vorrebbe collegarlo a uno pubblico se esiste). – yigit

+0

Ho sollevato un bug report per questo dopo aver fatto questo post. Ecco il [collegamento] (https://code.google.com/p/android-developer-preview/issues/detail?id=2418). Se si tratta di un problema simile, magari aggiungere un commento invece di creare un nuovo problema? –

+0

Grazie, verificherò che è corretto – yigit

3

Ho trovato un bug rispetto alla ObservableField, ha presentato here.

In base allo databinding guide una classe del modello può contenere gli attributi ObservableField per mantenere le sue definizioni di attributo brevi.Esempio dalla guida:

private static class User extends BaseObservable { 
    public final ObservableField<String> firstName = 
     new ObservableField<>(); 
    public final ObservableField<String> lastName = 
     new ObservableField<>(); 
    public final ObservableInt age = new ObservableInt(); 
} 

Utilizzando questa classe attribuisce il nome nella classe BR non vengono generati e le classi di implementazione non può essere compilato, perché si riferiscono ad essi. Eccezione: Tali attributi sono anche definite come variabili nel XML di layout, che non è il caso del layout esempio della guida:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="user" type="com.example.User"/> 
    </data> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{user.firstName}"/> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{user.lastName}"/> 
    </LinearLayout> 
</layout> 

BR.user è definito; BR.firstName, BR.lastName e BR.age non lo sono.

Modifica della classe User come questo risolve il problema:

private static class User extends BaseObservable { 
    @Bindable 
    public final ObservableField<String> firstName = 
     new ObservableField<>(); 
    @Bindable 
    public final ObservableField<String> lastName = 
     new ObservableField<>(); 
    @Bindable 
    public final ObservableInt age = new ObservableInt(); 
} 

A mio parere quando si usano tipi osservabili * i loro nomi dovrebbero essere aggiunti al BR.java per impostazione predefinita e @Bindable dovrebbe essere obsoleto.

Almeno la guida deve essere corretta aggiungendo l'annotazione @Bindable al codice di esempio ObservableField.

Mi ci sono voluti due giorni per analizzare e risolvere questo problema.

+0

Il bug è stato corretto nell'ultima versione di Android Databinding Library. –

1

Attualmente non supporta @style. Per esempio:

style="@{viewModel.getStyle() ?? @style/default_style}" 

È possibile che questo avrebbe tentato di impostare uno stile predefinito trovata negli stili risorsa se getStyle() ha restituito nulla. Sfortunatamente questo non è possibile, ma costituirebbe un'aggiunta molto potente al data binding imo.

1

Quando ho implementato il pattern MVVM con Data Binding Library su Android, ho trovato diversi bug. Alcuni di loro sono già stati menzionati qui. Sebbene, posso aggiungere un altro bug relativo agli eventi. Gli eventi non possono includere parametri. Implica che Data Binding Library non abbia un'importante capacità di trasferire alcune informazioni extra quando si inviano eventi. Tuttavia, spero che nella prossima versione verrà risolto. Finché ciò non accadrà, guarda qui la soluzione di questo problema: https://code.google.com/p/android/issues/detail?id=185097

Problemi correlati