: Không thể truy cập LifecyclOwner của Fragment View khi getView () là null, trước khi onCreateView () hoặc sau onDestroyView ()


8

Tôi đang sử dụng dữ liệu trực tiếp trong ứng dụng của mình cho tất cả các cuộc gọi mạng và xử lý phản hồi.

Trong một trong các trường hợp, chế độ xem trình tái chế của tôi đang tải một số dữ liệu trong chế độ xem của chủ sở hữu chế độ xem onBindvà phản hồi đang cập nhật giao diện người dùng. Để làm như vậy, tôi phải cung cấp lifecycleOwnercho người quan sát.

Vì chế độ xem của trình tái chế không có bất kỳ chủ sở hữu vòng đời nào của riêng mình, tôi đang sử dụng đoạn cha mẹ cho điều đó bằng cách sử dụng parentFragment.viewlifecycleOwnernhưng bằng cách nào đó, nó đang báo lỗi.

Làm thế nào một Chủ sở hữu xem có thể có cá thể của nó khi đoạn cha mẹ không có cá thể của nó?

viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
    updateUI(it)
})

Ngoại lệ gây tử vong: java.lang.IllegalStateException: Không thể truy cập LifecyclOwner của Fragment View khi getView () là null tức là trước onCreateView () hoặc sau onDestroyView ()


1
Vấn đề là ViewHolder của tôi đã tìm nạp một số dữ liệu từ máy chủ và sau khi nhận được phản hồi, dữ liệu thực tế cho chủ sở hữu đã được tạo, một lần nữa có một số người quan sát được đính kèm bằng chủ vòng đời của đoạn cha mẹ. Nhưng nếu tôi điều hướng khỏi đoạn trong khi trình xem của tôi đang tìm nạp dữ liệu, thì khung nhìn của đoạn cha mẹ đã bị hủy và khi người xem có phản hồi và thử gắn trình quan sát với chủ vòng đời của đoạn cha mẹ, nó sẽ ném lỗi được đề cập ở trên không có góc nhìn còn lại với đoạn cha mẹ.
Utkarsh Singh

Câu trả lời:


0

Giải pháp cho tôi đã được đơn giản hóa. Tôi đang sử dụng các trình quan sát riêng biệt - một cho mạng đang sử dụng Lifecyclowner từ hoạt động chính (hoặc chỉ từ bất kỳ hoạt động nào) và một cho chế độ xem phân đoạn (mô hình chế độ xem mô hình).


0

Trong tài liệu getViewLifecycleOwner ( ), tôi không nghĩ rằng, tôi có thể giải thích rõ hơn:

Phương thức đầu tiên an toàn để truy cập vòng đời của chế độ xem là onCreateView (LayoutInflater, Viewgroup, Bundle) với điều kiện bạn phải trả về chế độ xem không null (một IllegalStateException sẽ bị ném nếu bạn truy cập vào vòng đời của chế độ xem nhưng không quay lại một cái nhìn không null).

Vòng đời của khung nhìn vẫn còn hiệu lực thông qua lệnh gọi onDestroyView (), sau đó getView () sẽ trả về null, vòng đời của khung nhìn sẽ bị hủy và phương thức này sẽ ném IllegalStateException. Cân nhắc sử dụng getViewLifecycleOwnerLiveData () hoặc FragmentTransaction.runOnCommit (Runnable) để nhận cuộc gọi lại khi vòng đời chế độ xem của Fragment khả dụng.

public LifecycleOwner getViewLifecycleOwner() {
    if (mViewLifecycleOwner == null) {
        throw new IllegalStateException("Can't access the Fragment View's LifecycleOwner when "
                + "getView() is null i.e., before onCreateView() or after onDestroyView()");
    }
    return mViewLifecycleOwner;
}

-1

Giải pháp, như nhận xét của bạn, là đảm bảo quan điểm của đoạn không bị rỗng. Điều này đã xảy ra với tôi với một mảnh vỡ trong ViewPager.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.