2014-09-25 3 views
2

У меня есть ArrayList, заполненный некоторыми пользовательскими POJO, которые я бы хотел сохранить, когда пользователь переключает ориентацию экрана (onSaveInstanceState) и когда, например, пользователь нажимает кнопку «Назад» (onPause).Android сохраняет ArrayList <CustomObject> onPause и onSaveInstanceState

Насколько я знаю, SharedPreferences может содержать только примитивные типы данных, и связки не могут содержать ссылки на общие ArrayLists.

Любые советы о том, как справиться с этим?

С уважением,

Маркус

+0

задерживаясь обратно не только приостановить, но и уничтожить 'Activity'. Имея это в виду, вам нужно будет записать данные в какой-то файл, если вы хотите, чтобы он выжил. Были ли вы просто обращены к примерам, когда пользователь может быть прерван при использовании вашего приложения? – NasaGeek

+0

Ответ = http://stackoverflow.com/questions/7145606/how-android-sharedpreferences-save-store-object + http://stackoverflow.com/questions/7361627/how-can-write-code-to-make -sharedpreferences-for-array-in-android/7361989 # 7361989 –

+0

@PiyushKukadiya Gson устарел – Marcus

ответ

1

1- создать класс и поместить все, что вы хотите сохранить, например arraylist вашего POJO и сделать этот класс реализуемым интерфейсом Serializable.

class MyBundle implements Serializable { 

    ArrayList<POJO> mPOJO; 


    MyBundle(ArrayList<POJO> pojo){ 

    mPOJO= pojo; 


    } 

} 

2- записи его в файл:

ObjectOutputStream oos = null; 
FileOutputStream fout = null; 
try{ 
     FileOutputStream fout = new FileOutputStream("Your file path"); 
     ObjectOutputStream oos = new ObjectOutputStream(fout); 
     oos.writeObject(mb); // mb is an instance of MyBundle 
} catch (Exception ex) { 
     e.printStackTrace(); 
}finally { 
    if(oos != null){ 
    oos.close(); 
    } 
} 

и получить обратно все:

ObjectInputStream objectinputstream = null; 
try { 
     streamIn = new FileInputStream("Your file address"); 
     objectinputstream = new ObjectInputStream(streamIn); 
     MyBundle mb = (MyBundle) objectinputstream.readObject(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    }finally { 
    if(objectinputstream != null){ 
     objectinputstream .close(); 
    } 
    } 
+0

Нет ли другого способа, кроме создания файла для хранения одного простого списка массивов? – Marcus

+0

для 'onSaveInstanceState' вы можете использовать' ParcelableArray', но для 'user hits the back button' вы должны использовать' file' или 'database'. – mmlooloo

+0

Я предпочел бы использовать базу данных, чем писать в файл – Marcus

0

Попробуйте преобразовать список в Json с помощью Gson или Джексон. Сохраните строку в разделе «Общие предпочтения». некоторые вещи, как показано ниже код

String listString = gsonSD.toJson(list<object> instance); 
SharedPreferences storeDataPref = getContext().getSharedPreferences("list_store_pref", Context.MODE_PRIVATE); 
Editor storeDataEditor = storeDataPref.edit(); 
storeDataEditor.putString("liststringdata", listString).apply(); 
+0

Жестокий тест, где я могу скачать его? (версия, которая не устарела) – Marcus

+0

извините, я не могу получить ... где я могу скачать? –

1

я не знаю, что это правильный метод или нет, но я справиться с этим, как это это всегда успех в то время как ваше приложение потеряли все данные кэша сам, то и вы можете получить обратно сериализуемым object->

для общих ArrayLists всегда использовать сериализации

просто посмотреть на один раз http://developer.android.com/reference/java/io/Serializable.html

0

Дубликат вопрос смотрите ответ на этот вопрос о сохранении Список_массивов в состоянии: https://stackoverflow.com/a/25400275/1826581

+0

Это ответ на половину моего вопроса – Marcus

+0

Я думаю, вам нужно использовать startActivityForResult, когда вы начинаете свою деятельность, и получаете свои анализируемые данные из onActivityResult (int requestCode, int resultCode, Intent data), когда возвращаетесь к активности. –