2011-01-25 36 views
8

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.

Trả lời

4

Có thể bạn đang sử dụng con trỏ được quản lý. Các con trỏ được quản lý sẽ tự động đóng khi Activity bị hủy. Bạn nên chuyển sang một con trỏ không được quản lý.

+0

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

0

Chỉ cần thêm thuộc tính này trong thẻ hoạt động của bạn trong file menifest

android: configChanges = "định hướng | keyboardHidden"

nó sẽ giải quyết này

không cần phải thực hiện bất cứ điều gì khác

:) Nó đã giúp tôi mặc dù

+0

Xin chào Javanator!Càng nhiều càng tốt, tôi muốn có cách xử lý thay đổi. Theo tài liệu, đó phải là phương sách cuối cùng. ;) Vì vậy, chúng ta hãy hy vọng tôi có thể sửa lỗi này. : D – Zarah

+0

Tôi đang chờ kết quả của bạn. giải pháp đơn giản này đã từng giải quyết được một vấn đề phức tạp của tôi. Đây cũng không phải là lối tắt cho bất kỳ thứ gì. nó chỉ yêu cầu Trình quản lý hoạt động không gọi lại onCreate nữa. Theo như tôi biết. :) – Javanator

+0

Điều này, theo [tài liệu] [1]: 'Lưu ý: Việc tự thay đổi cấu hình có thể làm cho việc sử dụng tài nguyên thay thế trở nên khó khăn hơn, vì hệ thống không tự động áp dụng chúng cho bạn. Kỹ thuật này nên được coi là phương sách cuối cùng và không được đề xuất cho hầu hết các ứng dụng.' Sẽ cho bạn biết cách tôi giải quyết vấn đề này. :) [1] http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject – Zarah

Các vấn đề liên quan