Tôi đang cố gắng làm cho ứng dụng của mình xoay vòng thân thiện, nhưng tôi đang gặp một số sự cố khi lưu con trỏ.Làm cách nào để làm cho Con trỏ của tôi tồn tại một sự thay đổi định hướng?
Con trỏ giữ khoảng 13k + hàng dữ liệu được hiển thị trong ListView
và do đó sẽ mất nhiều thời gian nếu tôi thực hiện yêu cầu mỗi lần thay đổi cấu hình. Trong số onRetainNonConfigurationInstance()
, tôi trả lại Con trỏ của mình và sau đó truy xuất Con trỏ qua getLastNonConfigurationInstance()
.
Tuy nhiên, con trỏ đã truy xuất của tôi dường như đã bị đóng và do đó bộ điều hợp của tôi không thể hiển thị danh sách nữa. Từ những gì tôi hiểu, con trỏ đã bị đóng vì onDestroy()
tự động đóng tất cả các con trỏ.
tôi lưu các con trỏ như thế này:
@Override
public Object onRetainNonConfigurationInstance() {
return myCursor;
}
Và lấy nó như thế này:
myCursor = (Cursor)getLastNonConfigurationInstance();
if (myCursor == null) {
// Do some stuff here (access DB, etc)
} else { // we are returning from configuration change
// Feed the cursor to the adapter
}
Tôi dán stack trace nếu ai đó muốn nhìn vào nó:
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): android.database.StaleDataException: Access closed cursor
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): at com.test.sample.helper.DictionaryAdapter.bindView(DictionaryAdapter.java:35)
[........More ListView-related errors here..........]
Tôi bước qua mã và tôi phát hiện ra rằng theo như onRetainNonConfigurationInstance()
, con trỏ vẫn mở, nhưng fter nhận được nó thông qua getLastNonConfigurationInstance()
nó đã được đóng lại.
Làm cách nào để làm cho Con trỏ của tôi tồn tại thay đổi định hướng? Cảm ơn bạn vì sự giúp đỡ!
EDIT: Dựa trên câu trả lời của Romain, tôi đã nhận xét tất cả startManagingCursor()
s của mình. Tôi nên kết nối các dấu chấm và nghĩ về nó! Dù sao, ứng dụng của tôi bây giờ tồn tại một vòng quay, nhưng lật nó trở lại hướng ban đầu vẫn còn treo nó. Tiếp tục gỡ lỗi của tôi và sẽ cho bạn biết những gì tôi tìm ra.
EDIT2: Tôi nghĩ rằng tôi có thể đã tìm thấy nguyên nhân gây ra lỗi mới. Tôi đã triển khai một số FilterQueryProvider
trả về một Con trỏ mới. Những gì tôi đã làm được gán kết quả của bộ lọc đó cho con trỏ ban đầu của tôi. Dường như làm việc cho đến nay.
Có! Tôi đang sử dụng một con trỏ được quản lý. Tôi đã cố gắng để bình luận ra tất cả 'startManagingCursor()' của tôi, và cho đến nay các ứng dụng đã sống sót thay đổi từ chân dung đến phong cảnh. Nhưng thay đổi nó trở lại một lần nữa để chân dung treo ứng dụng (Gây ra bởi: java.lang.IllegalStateException: cố gắng để có được một tham chiếu trên một đóng SQLiteClosable). Sẽ cố gắng để gỡ lỗi nhiều hơn, nhưng câu trả lời này chắc chắn đã giúp! Cảm ơn Romain! Tôi sẽ báo cáo lại bất cứ điều gì xảy ra với các bài kiểm tra của tôi. – Zarah