2

J'essaie d'implémenter les nouveaux composants d'architecture android et j'ai utilisé des données en direct dans le fragment et le modèle de vue mais lorsque j'ajoute un observateur aux données en direct, l'application se bloque en lançant cette exception.Exception d'observateur de données Android Live

Process: com.nrs.nsnik.architecturecomponents, PID: 3071 

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.nrs.nsnik.architecturecomponents/com.nrs.nsnik.architecturec 
omponents.view.MainActivity}: java.lang.ClassCastException: android.arch.lifecycle.LiveData_LifecycleBoundObserver_LifecycleAdapter cannot be cast to android.arch.lifecycle.GeneratedAdapter 
. 
. 
. 
. 
Caused by: java.lang.ClassCastException: android.arch.lifecycle.LiveData_LifecycleBoundObserver_LifecycleAdapter cannot be cast to android.arch.lifecycle.GeneratedAdapter 

Liste Fragment:

public class ListFragment extends Fragment { 

    @BindView(R.id.listFragmentRecyclerView) 
    RecyclerView mRecyclerView; 
    @BindView(R.id.listFragmentAddItem) 
    FloatingActionButton mFloatingActionButton; 
    private Unbinder mUnbinder; 
    private CompositeDisposable mCompositeDisposable; 
    private ListViewModel mListViewModel; 
    private List<NoteEntity> mNoteEntityList; 
    private ListAdapter mListAdapter; 
    private NoteDatabase mNoteDatabase; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_list, container, false); 
     mUnbinder = ButterKnife.bind(this, v); 
     mListViewModel = ViewModelProviders.of(this).get(ListViewModel.class); 
     mNoteDatabase = ((MyApplication)getActivity().getApplication()).getNoteDatabaseInstance(); 
     initialize(); 
     listeners(); 
     return v; 
    } 

    private void initialize() { 
     mCompositeDisposable = new CompositeDisposable(); 
     mNoteEntityList = new ArrayList<>(); 
     mListAdapter = new ListAdapter(getActivity(), mNoteEntityList); 
     mListViewModel.getNoteList().observe(this, noteEntityList -> { 
      mListAdapter.swapList(noteEntityList); 
      mListAdapter.notifyDataSetChanged(); 
     }); 
    } 

    private void cleanUp() { 
     if (mUnbinder != null) { 
      mUnbinder.unbind(); 
     } 
     if (mCompositeDisposable != null) { 
      mCompositeDisposable.dispose(); 
     } 
    } 

    private void listeners() { 
     RxView.clicks(mFloatingActionButton).subscribe(o -> { 
     AlertDialog.Builder newNoteDialog = new AlertDialog.Builder(getActivity()); 
     View v = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_add_note_dialog, null); 
     newNoteDialog.setView(v); 
     EditText editText = v.findViewById(R.id.addNoteEditText); 
     newNoteDialog.setNegativeButton(getActivity().getResources().getString(R.string.cancel), (dialogInterface, i) -> { 
     }).setPositiveButton(getActivity().getResources().getString(R.string.add), (dialogInterface, i) -> { 
      if (isValid(editText)) { 
       NoteEntity entity = new NoteEntity(); 
       entity.setNote(editText.getText().toString()); 
       entity.setDate(getCurrentDate()); 
       mNoteDatabase.getNoteDao().insertNote(entity); 
      } 
     }); 
     newNoteDialog.create().show(); 
     }); 
    } 

    private Date getCurrentDate() { 
     Date date = new Date(Calendar.getInstance().getTimeInMillis()); 
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH); 
     simpleDateFormat.format(date); 
     return date; 
    } 

    private boolean isValid(EditText editText) { 
     return !(editText.getText().toString().length() <= 0 || editText.getText().toString().isEmpty()); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     cleanUp(); 
     if (BuildConfig.DEBUG) { 
      RefWatcher refWatcher = MyApplication.getRefWatcher(getActivity()); 
      refWatcher.watch(this); 
     } 
    } 
} 

ViewModel:

public class ListViewModel extends AndroidViewModel { 

    private LiveData<List<NoteEntity>> mNoteList; 
    private final NoteDatabase mNoteDatabase; 

    ListViewModel(Application application) { 
     super(application); 
     mNoteDatabase = ((MyApplication)application).getNoteDatabaseInstance(); 
     mNoteList = mNoteDatabase.getNoteDao().getNoteList(); 
    } 

    public LiveData<List<NoteEntity>> getNoteList() { 
     return mNoteList; 
    } 
} 

NoteDatabase:

@Database(entities = {NoteEntity.class}, version = 1) 
public abstract class NoteDatabase extends RoomDatabase { 
    public abstract NoteDao getNoteDao(); 
} 

App plante si ajoutez le sur les données obverse en direct.

Je construis une instance unique de la base de données dans ma classe d'application en utilisant la fonction "Room.databaseBuilder (....)" et en l'utilisant partout et ma classe NoteEntity a trois champs on est id qui est une clé primaire auto-génère.

+0

Quelqu'un peut-il aider ?? – Nsnik

+0

Quelles sont les super classes de votre fragment et viewmodel? Pouvez-vous également fournir l'extrait de code de NoteDatabase? –

+0

@LongRanger J'ai mis à jour le code dans la publication. – Nsnik

Répondre

5

j'ai eu erreur semblable, dans mon cas a été causé par cette dépendance dans le fichier gradle.build:

implementation "android.arch.lifecycle:common-java8:1.0.0-beta2" 
0

Le FirebaseUI n'a pas encore mis à jour android.arch.lifecycle à-beta2 1.0.0.

Utilisez 1.0.0-beta1 au lieu de 1.0.0-beta2.
Attendez jusqu'à ce qu'ils mettent à jour la bibliothèque de cycle de vie.