Пишу приложение, которое работает с интернетом(делает запросы - получает данные).
Прелюдия: пользователь запустил первый раз приложение - получил какие-то данные и закрыл(совсем) приложение. Данные соответственно сохранились.
Проблема: как при следующем запуске приложения загрузить все данные, что были сохранены единоразово? Т.е. приложение запускается - данные загрузились/обновились и работаем, причем при переходе с активити в другую активити и возвращении обратно - не должно быть никаких загрузок/обновлений?
Как пробовал:
В onCreate помещал
Код: Выделить всё
// Приложение запущено впервые или восстановлено из памяти?
if ( savedInstanceState == null ) // приложение запущено впервые
{
загружаем
обновляем
}
else // приложение восстановлено из памяти
{
ничего не делаем
}Другой вариант:
в туже onCreate
Сработает один раз(то есть запустили приложение - загрузилось, при остальных запусках ничего не будет прогружаться, и всеSharedPreferences prefs = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Perhaps set content view here
prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE);
}
@Override
protected void onResume() {
super.onResume();
if (prefs.getBoolean("firstrun", true)) {
// Do first run stuff here then set 'firstrun' as false
// using the following line to edit/commit prefs
prefs.edit().putBoolean("firstrun", false).commit();
}
}
Ну и были еще всяческие вариации с sharedpreferences - тоже успехом не увенчалось.
Сохраняю данные в onPause() (сохранение отрабатывает корректно)
Загружать хотел в onResume(), но так и не могу понять как сделать так, чтобы при использовании, например, sharedpreferences значение firstrun - принимало true, когда приложение падает/закрывается руками/ и т.д.
Нид хелп.....
-----
После долгих поисков - уже не знаю как реализовать этот момент.
Решил попытаться через создание своего класса Application и в нем выполнение загрузки и обновления.
Загрузка-то происходит нормально, но вот обновление не просходит, тк AsyncTask отказывается работать.
Реализация такая:
Код: Выделить всё
/*
* Copyright (c) 2015. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.link.tes;
import android.app.Application;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.util.Log;
import java.util.ArrayList;
/**
* Created by Dual on 13.03.15.
*/
public class App extends Application {
private static App singleton;
public static ArrayList<universal> Data = new ArrayList<>();
private static ArrayList<universal> temp = new ArrayList<>();
private SharedPreferences UniDat;
private universal member;
public static App getInstance(){
return singleton;
}
@Override
public final void onCreate(){
super.onCreate();
singleton = this;
LoadData();
UpdData();
}
public ArrayList getData(){
return Data;
}
private void LoadData(){
int i = 0;
String l;
String p;
String o;
UniDat = getSharedPreferences("UniData", MODE_PRIVATE);
int n = UniDat.getInt("UniSize",0);
Log.i("load unisize", Integer.toString(UniDat.getInt("UniSize", 0)));
while (i < n){
l = UniDat.getString("UniItem log " + i,"");
// Log.i("load", UniData.getString("UniItem log " + i,""));
p = UniDat.getString("UniItem pass " + i, "");
// Log.i("load", UniData.getString("UniItem pass " + i,""));
o = UniDat.getString("UniItem oper " + i, "");
// Log.i("load", UniData.getString("UniItem oper " + i,""));
member = new universal(l, p, o);
Data.add(member);
i++;
}
Log.i("load", "Load ok");
}
private void UpdData(){
if(Data.size() != 0)
{
int a_error;
int i = 0;
temp.addAll(Data);
Data.clear();
while (i < temp.size())
{
Task Upd = new Task();
Upd.execute(temp.get(i).log, temp.get(i).pass, temp.get(i).oper);
Log.i("upd","user "+i);
i++;
}
temp.clear();
}
Log.i("upd", "Update ok");
}
class Task extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String s ;
s = uni(params[0],params[1],params[2]);
return s;
}
String uni(String l, String p, String o) {
member = new universal(l,p,o);
Log.i("oky", "beforeauth");
if (member.Auth(member.log,member.pass) == 0){
Log.i("oky", "inauth");
member.GetInfo();
member.Parse();
Data.add(member);
return member.f_info;
}
// return "";
else return member.error;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
}И вызываю так:
Код: Выделить всё
App mApp = (App)getApplicationContext();
uniItems.addAll(mApp.getData());
Log.i("size",Integer.toString(uniItems.size()));