2

새로운 안드로이드 아키텍처 구성 요소를 구현하고 프래그먼트 및 뷰 모델에서 라이브 데이터를 사용하고 있지만 라이브 데이터에 옵저버를 추가하면이 예외가 발생하여 응용 프로그램이 중단됩니다.Android 라이브 데이터 옵저버 예외

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 

목록 조각 :

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); 
     } 
    } 
} 

뷰 모델 :

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(); 
} 

응용 프로그램이 충돌합니다.

"Room.databaseBuilder (....)"함수를 사용하여 응용 프로그램 클래스에서 데이터베이스의 단일 인스턴스를 만들고 모든 곳에서 사용하고 내 NoteEntity 클래스에는 세 개의 필드가 있습니다. 하나는 기본 키인 ID입니다. 자동 생성됩니다.

+0

아무도 도와 줄 수 있습니까 ?? – Nsnik

+0

조각과 뷰 모델의 수퍼 클래스는 무엇입니까? NoteDatabase의 코드 스 니펫도 제공 할 수 있습니까? –

+0

@LongRanger 게시물의 코드를 업데이트했습니다. – Nsnik

답변

5

I 있었다 유사한 오류, 내 경우는 gradle.build 파일이 종속성에 의해 발생되었다에 : 1.0.0 - 베타 2에

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

FirebaseUI 아직 업데이트하지 않았습니다 android.arch.lifecycle.

1.0.0-beta2 대신 1.0.0-beta1을 사용하십시오.
라이프 사이클 라이브러리를 업데이트 할 때까지 기다리십시오.