2011-01-25 14 views
8

Uygulamamın rotasyonunu kolay hale getirmeye çalışıyorum, ancak imleci kaydetmede bazı sorunlar yaşıyorum.İmleçim bir yönelim değişikliğinden nasıl kurtulur?

İmleç, ListView numaralı belgede görüntülenen yaklaşık 13 k + satırlık veri miktarına sahiptir ve bu nedenle yapılandırma her değiştiğinde bir istekte bulunacak olursam oldukça uzun bir süre alır. Benim onRetainNonConfigurationInstance() benim imleci döndürüyor ve daha sonra getLastNonConfigurationInstance() aracılığıyla alma.

Ancak, aldığım imleç zaten kapalı görünüyor ve bu nedenle bağdaştırıcım artık listeyi oluşturamıyor. Anladığım kadarıyla, imleç onDestroy() otomatik olarak tüm imleçleri kapattığından kapatıldı. Birisi ona bakmak istiyorsa ben yığın izlemesi yapıştırarak am

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 
} 

:

@Override 
public Object onRetainNonConfigurationInstance() { 
    return myCursor; 
} 

Ve böyle geri almak:

böyle İmleç kurtarmak

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..........] 

Kodun içine adım attım ve bunu onRetainNonConfigurationInstance()'a kadar buldum, imleç hala açık, ancak getLastNonConfigurationInstance() aracılığıyla alınıyor, zaten kapalı.

Yönlendiricimde yönlendirme değişikliğinden nasıl yararlanabilirim? Yardım için teşekkürler!

DÜZENLEME: Romain'in cevap dayanarak , ben bütün startManagingCursor() s dışarı yorumladı. Noktaları birleştirip düşünmeliydim! Neyse, uygulamam şimdi bir rotasyondan geçiyor, ancak orijinal oryantasyona geri döndürülmesi hala çöküyor. Hata ayıklamaya devam ediyorum ve ne öğrendiğimi anlatayım.

EDIT2: Yeni hatalara neyin neden olduğunu bulmuş olabilirim. Yeni bir İmleç döndüren bir FilterQueryProvider uyguladık. Yaptığım şey, o filtrenin sonuçlarını orijinal İmleçime atamaktı. Şimdiye kadar çalışıyor gibi görünüyor.

cevap

4

Muhtemelen yönetilen bir imleç kullanıyorsunuzdur. Etkinlik imha edildiğinde yönetilen imleçler otomatik olarak kapatılır. Yönetilmeyen bir İmleç'e geçmelisiniz.

+0

Evet bana yardım etti! Yönetilen bir imleç kullanıyorum. Tüm 'startManagingCursor()' işlevini denemeye çalıştım ve şimdiye kadar uygulama portretan manzaraya geçerek hayatta kalmayı başardı. Ancak tekrar portreye geri çevirmek uygulamayı kilitler (Neden: java.lang.IllegalStateException: yakın bir SQLiteClosable üzerinde bir referans elde etme girişimi). Daha fazla hata ayıklamaya çalışacağız, ancak bu cevap kesinlikle yardımcı oldu! Teşekkürler Romain! Testlerime ne olursa olsun rapor edeceğim. – Zarah

0

Sadece menifest dosyası

android daki etkinlik etiketinde bu niteliği ekleyin: configChanges = "oryantasyon | keyboardHidden"

o başka bir şey uygulamak için bu

gerek çözecektir

:)

+0

Merhaba Javanator!Mümkün olduğunca, değişimi ele almak için "doğru" bir yola sahip olmak isterim. Belgelere göre, bu son çare olmalı. ;) Yani umarım bunu düzeltebilirim. : D – Zarah

+0

Sonucunu bekliyorum. Bu basit çözüm bir zamanlar benim karmaşık bir problemi çözdü. Bu, herhangi bir şeyin kısayolu değildir. Etkinlik Yöneticisi'ne onCreate'ı tekrar çağırmamasını söyler. Bildiğim kadarıyla. :) – Javanator

+0

Bu, [belgeler] [1] 'e göre: Not: Yapılandırma değişikliğini kendiniz yapmak, alternatif kaynakları kullanmanın daha zor hale gelmesini sağlayabilir çünkü sistem sizin için otomatik olarak uygulanmaz. Bu teknik bir son çare olarak düşünülmeli ve çoğu uygulama için önerilmemektedir. Bunu nasıl çözdüğümü bilmenizi sağlayacaktır. :) [1] http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject – Zarah

İlgili konular