मेरे पास एक टुकड़ा है जिसमें एक सूचीदृश्य है।ContentProvider परमाणु कॉल करता है? ऑन पर रोकें, ऑनएक्टिविटी में लोड, पुराने डेटा
ऑनपॉज़() में मैं ContentProvider में सूचीदृश्य की वाई स्क्रॉल स्थिति को सहेज रहा हूं।
रेज़्यूम या एक्टिविटी पर आधारित एक ही टुकड़ा सामग्रीप्रोवाइडर से उस वाई स्क्रॉल स्थिति को पकड़ने और स्क्रॉल स्थिति को पुनर्स्थापित करने के लिए लोडर का उपयोग करता है।
यदि मैं गतिविधि/टुकड़े से बाहर निकलता हूं और उस पर वापस लौटता हूं, तो यह काम करता है, सूचीदृश्य अपने अंतिम खोले गए स्थान पर लौटता है क्योंकि इसे सामग्री प्रोवाइडर पर सहेज दिया गया था। तो कोड 100% ठीक है।
क्या ठीक नहीं है, घुमाव पर डेटा है। पर रोक ठीक है, लेकिन क्रिएटएक्टिविटी के बाद लोड पुराने डेटा को पुनर्प्राप्त करने के परिणामस्वरूप, रोकें से पहले डेटा। इसके परिणामस्वरूप ओल्ड स्थिति में लौटने पर सूचीदृश्य में परिणाम होता है जब उन्होंने पहली बार ऐप खोला था, न कि स्थिति जहां रोटेशन से पहले था।
यह एक स्पष्ट दौड़ की स्थिति की तरह लगता है कि ऑनपॉज़ के दौरान सामग्री प्रदाता को सहेजने पर रोक नहीं है, जिसके परिणामस्वरूप पुराने डेटा को घुमाने के बाद लोड किया जा रहा है।
तो मेरे फ़ोन पर घुमाने की तरह इस
01:31:33.026: ThreadViewerFragment.java(235):onPause Saved(position:Yposition): 59:-74
01:31:33.256: ThreadViewerFragment.java(194):onActivityCreated
01:31:33.266: ThreadViewerFragment.java(309):onLoadFinished Load(position:Yposition): 62:-149 //initial load is of old values
01:31:33.266: ThreadViewerFragment.java(309):onLoadFinished Load(position:Yposition): 62:-149
01:31:33.596: ThreadViewerFragment.java(309):onLoadFinished Load(position:Yposition): 59:-74 //this is loaded due to notification by the save in onPause which is supposed to be finished before recreating the new fragment???
तो आदेश ठीक लग रहा है लग रहा है के बजाय लेकिन स्पष्ट रूप से, यह भरी हुई है पुराने मूल्यों (गतिविधि/टुकड़ा प्रवाह के मामले में एक रेस स्थिति की तरह नहीं दिखता) 59: -74 के केवल सहेजे गए मूल्यों में से।
मैं आसपास के काम के बाद नहीं हूं, मुझे पता है कि saveInstanceState आदि का उपयोग कैसे करें। लेकिन मुझे अपना कोड क्यों दोगुना करना चाहिए, क्या सामग्रीप्रोवाइडर को परमाणु व्यवहार करने के लिए मजबूर करने का कोई तरीका है (जिसे मैंने पहले ही सोचा था?)
संपादित करें: कोड जोड़ना और प्रश्न को थोड़ा बेहतर परिष्कृत करना क्योंकि मैं अभी भी संतुष्ट नहीं हूं कि अगर सामग्री प्रदाता निष्पादित होने पर ब्लॉक को कॉल करता है और/या यदि वे कॉल परमाणु हैं या यदि यह केवल गलतफहमी है तो हम समझने के करीब हैं contentproviders और लोडर के।
onPause में, मैं उत्पाद लिस्टिंग
@Override
public void onPause() {
super.onPause();
Utils.logv("onPause Saved position: " + mLastRead + ", " + mYPos);
ContentValues contentValues = new ContentValues();
contentValues.put(ProductsContract.Products.Y_POS, mYpos);
int updateCount = getActivity().getContentResolver().update(
Uri.parse(ProductsContract.Products.CONTENT_URI + "/" + mId),
contentValues, null, null);
}
मेरे समझते हैं कि कॉल अद्यतन करने के लिए एक अवरुद्ध कॉल होना चाहिए की Y स्थिति बंद बचत कर रहा हूँ, और इससे पहले टुकड़ा नष्ट कर दिया और इससे पहले कि है यह तब होता है नई टुकड़ा रोटेशन
में फिर से शुरू पर मैं अपने लोडर
public void onResume() {
super.onResume();
getLoaderManager().initLoader(PRODUCTS_LOADER_ID, null, this);
}
ऊपर आग और मेरे लोडर में मैं कर्सर, मज़बूती से है जो मिलता है संभाल करने के लिए बनाई गई है एक घुमाने के बाद पुराने डेटा है, लेकिन किसी भी अन्य परिस्थिति
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if(cursor.moveToFirst()){
mYpos = cursor.getInt(cursor.getColumnIndex(ProductsContract.Products.Y_POS));
Utils.logv("loader: " + mYpos);
}
}
तो restating में ठीक है, एक घुमाने के बाद, लोडर लगातार पुराने डेटा वितरित करेंगे।
मुझे लगता है कि शायद यह लोडर है जो स्टेल है और सामग्री प्रदाता स्वयं नहीं है? घुमावदार होने के बावजूद कर्सर को सहेजा और बहाल किया जाता है, भले ही यह बाँध हो?
यह एंड्रॉइड 2.3 पर एसडीके 8 नमूना ऐप नोटपैड के साथ निश्चित रूप से मामला है। Resume() में एक ब्रेकपॉइंट सेट करें (लाइन पर या उससे पहले "mText.setTextKeepState (नोट);"), नोट में परिवर्तन करें, स्क्रीनलॉक सक्रिय करें, स्क्रीन अनलॉक करें, और नोट टेक्स्ट में अभी भी बदलाव होंगे जब स्क्रीनलॉक सक्रिय किया गया था। ऑनस्यूम() के माध्यम से कदम उठाएं और "स्ट्रिंग नोट = mCursor.getString (COLUMN_INDEX_NOTE) निष्पादित करने के बाद;" आपको मूल नोट टेक्स्ट बहाल करना चाहिए। – Huperniketes