Загрузка данных на старте приложения

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
FeonoR
Сообщения: 5
Зарегистрирован: 07 мар 2015, 18:46

Загрузка данных на старте приложения

Сообщение FeonoR » 11 мар 2015, 20:20

Доброго времени суток.
Пишу приложение, которое работает с интернетом(делает запросы - получает данные).

Прелюдия: пользователь запустил первый раз приложение - получил какие-то данные и закрыл(совсем) приложение. Данные соответственно сохранились.
Проблема: как при следующем запуске приложения загрузить все данные, что были сохранены единоразово? Т.е. приложение запускается - данные загрузились/обновились и работаем, причем при переходе с активити в другую активити и возвращении обратно - не должно быть никаких загрузок/обновлений?

Как пробовал:
В onCreate помещал

Код: Выделить всё

// Приложение запущено впервые или восстановлено из памяти?
if ( savedInstanceState == null )   // приложение запущено впервые
{
   загружаем
   обновляем
} 
else // приложение восстановлено из памяти
{
    ничего не делаем
}
Не работает по причине того что всегда state = null (

Другой вариант:
в туже 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()));

FeonoR
Сообщения: 5
Зарегистрирован: 07 мар 2015, 18:46

Re: Загрузка данных на старте приложения

Сообщение FeonoR » 13 мар 2015, 08:05

Эх... в общем проблема решена, надеюсь будет работать.
Если кому интересно:
Сделал как выше писал через Application Class, путем придудительного возврата ответа от AsyncTask

Код: Выделить всё

package com.link.tes;

import android.app.Application;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.util.Log;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

/**
 * 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;

    private ProgressDialog pd;

    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();
                try {
                    member =  Upd.execute(temp.get(i).log, temp.get(i).pass, temp.get(i).oper).get();
                    Data.add(member);
                    Log.i("upd", "user " + i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }


                i++;
            }
            temp.clear();
        }
        Log.i("upd", "Update ok");
    }

    class Task extends AsyncTask<String, Void, universal> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        @Override
        protected universal doInBackground(String... params) {

            member = new universal(params[0],params[1],params[2]);
            Log.i("oky", "beforeauth");
            if (member.Auth(member.log,member.pass) == 0){
                Log.i("oky", "inauth");
                member.GetInfo();
                member.Parse();
//                Data.add(member);

//            String s ;
//            s = uni(params[0],params[1],params[2]);
//            return s;
            }
            return member;

//        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;
//            }
//
////            return  "";
//            else return member.error;

        }


        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(universal result) {
            super.onPostExecute(result);
        }
    }


}

Ответить