Mam fragment, który ma widok listy.ContentProvider dzwoni atomowo? Zapisz na onPause, załaduj w OnActivityCreated, stare dane
W onPause() Zapisuję pozycję przewijania Y widoku listy w dostawcy treści.
Ten sam fragment w trybie onResume lub onActivityCreated używa programu ładującego do przechwytywania pozycji przewijania y od dostawcy treści i przywracania pozycji przewijania.
Jeśli wyjdę z działania/fragmentu i powrócę do niego, to działa, widok listy powraca do ostatniej otwartej lokalizacji, ponieważ został zapisany do dostawcy treści w trybie onPause. Kod jest w 100% czysty.
Co nie jest w porządku, to dane na obrocie. onPause zapisuje dobrze, ale ładunek po onCreateActivity powoduje pobieranie starych danych, danych przed zapisaniem w onPause. Powoduje to, że widok listy powraca do pozycji OLD, kiedy po raz pierwszy otworzyli aplikację, a nie pozycji, w której widok listy był przed rotacją.
Wydaje się oczywistym warunkiem wyścigu, że zapisywanie do dostawcy treści podczas operacji onPause nie jest zakończone w operacji onPause, co powoduje, że stare dane są ładowane po obróceniu.
Więc obracania na mój telefon wygląda tak
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???
Więc kolejność wygląda dobrze (nie wyglądać wyścigu pod względem aktywności/przepływu fragment), lecz wyraźnie, to obciążonych starymi wartościami zamiast z właśnie zapisanych wartości 59: -74.
Nie jestem po pracy, wiem jak używać saveInstanceState itp. Ale dlaczego powinienem podwoić swój kod, czy istnieje sposób zmuszenia dostawcy treści do zachowania atomowego (co myślałem, że już było?)
Edycja: dodawanie kodu i ulepszanie pytania nieco lepiej, ponieważ nadal nie jestem zadowolony, że jesteśmy bliżej zrozumienia, jeśli wywołania contentprovider blokują się podczas wykonywania i/lub jeśli te połączenia są atomowe lub jeśli to tylko nieporozumienie dostawców treści i ładowarek.
W OnPause, ja ratuję się pozycję Y liście produktów
@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);
}
My rozumiemy to, że wezwanie do aktualizacji powinna być wezwanie blokowanie i występuje przed fragment jest zniszczona, a przed nowy fragment został stworzony, aby obsługiwać obrót
IN CV uruchomię mój ładowarka
public void onResume() {
super.onResume();
getLoaderManager().initLoader(PRODUCTS_LOADER_ID, null, this);
}
I w moim ładowarki, pojawia się kursor, który ma niezawodnie stare dane po obracać, ale jest w porządku w innych okolicznościach
@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);
}
}
więc przekształcenie po obracać, ładowarka będzie konsekwentnie dostarczać stare dane.
Myślę, że być może to ładowacz jest nieświeży, a nie sam dostawca treści? Że kursor jest zapisywany i przywracany po obrocie, mimo że jest nieaktualny?
Z pewnością jest tak w przypadku przykładowej aplikacji SDK 8 NotePad w systemie Android 2.3. Ustaw punkt przerwania w onResume() (w linii lub przed wierszem "mText.setTextKeepState (note);"), wprowadź zmiany do notatki, aktywuj blokadę ekranu, odblokuj ekran, a tekst notatki będzie nadal zawierał zmiany wprowadzone podczas blokady ekranu został aktywowany. Przejdź przez onResume() i po wykonaniu "String note = mCursor.getString (COLUMN_INDEX_NOTE);" powinieneś znaleźć oryginalny tekst notatki przywrócony. – Huperniketes