Global variable in Android application not persisting

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

I am designing an application which requires native contacts list. I am using cursorloader for retrieving contacts and saving it in hashmap globally in my application class

public class WoofyApp extends Application {
private static WoofyApp mInstance;
private FontFactory fontFactory;
private PreferenceService preferenceService;
private RequestQueue mRequestQueue;
private VolleyService mVolley;
private Validator mValidator;
private NetworkService mNetwork;
private DaoSession daoSession;
private HashMap<String,String> persons;
private ProgressDialog pdLoading;
private UserDao userDao;
private static final String WOOFYAPP = "WOOFYAPP";
@Override
public void onCreate() {
    super.onCreate();
    mInstance = this;
    persons = new HashMap<>();
}
 public  HashMap<String, String> getPersons(){
        return persons;
    }

public void setPersons(HashMap<String,String> per){
    persons = per;
}

I am accessing the contacts list in the relevant activities and fragments. And I am setting it in ContactService class :

public class ContactService implements LoaderManager.LoaderCallbacks<Cursor> {


HashMap<String, String> hmContacts;
ArrayList<Person> alContacts;
private Context mContext;
private EventBus bus;
WoofyApp mApp;

private static final String[] PROJECTION = {
        ContactsContract.CommonDataKinds.Phone.NUMBER,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
};

public ContactService(AppCompatActivity context) {
    hmContacts = new HashMap<>();
    alContacts = new ArrayList<>();
    this.mContext = context;
    bus = EventBus.getDefault();
    mApp = WoofyApp.getApp();
    Log.d(Constants.LIFE_CYCLE,"ContactService called");
    if(mApp.getPersons().size()==0){
        context.getLoaderManager().initLoader(0,null,this);
        if(!context.getLoaderManager().getLoader(0).isReset()) {
            context.getLoaderManager().restartLoader(0, null, this);
        }
        Log.d(Constants.LIFE_CYCLE,"ContactService loader called");
    } else{
        this.hmContacts = mApp.getPersons();
        this.alContacts = hashToArray(hmContacts);
        bus.post(hmContacts);
        bus.post(new ContactsAdapter(mContext, R.layout.row_contact_child, alContacts));
        Log.d(Constants.LIFE_CYCLE,"ContactService persons called");
    }
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Log.d(Constants.LIFE_CYCLE,"ContactService onCreateLoader called");
    return new CursorLoader(
            mContext,
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            PROJECTION,
            null,
            null,
            null
    );
}



@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    if (data.getCount() > 0) {
        while (data.moveToNext()) {
            String name = data.getString(
                    data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String number = Validator.formatNumbers(data.getString(
                    data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            if (!hmContacts.containsKey(number)){
                alContacts.add(new Person(name, number));
            }
            hmContacts.put(number, name);
        }
        Log.d(Constants.LIFE_CYCLE,"onLoadFinished loader called "+hmContacts.size());
        mApp.setPersons(hmContacts);
        bus.post(hmContacts);
        bus.post(new ContactsAdapter(mContext, R.layout.row_contact_child, alContacts));
    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
}


public static ArrayList<Person> hashToArray(HashMap<String,String>  hm){
    Iterator it = hm.entrySet().iterator();
    ArrayList<Person> persons = new ArrayList<>();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        persons.add(new Person((String)pair.getValue(),(String)pair.getKey()));
        it.remove();
    }
    return persons;
}
}
  THE STRANGE PART   

When I access it for first time from main activity and its fragment it is loading properly. But when I try to access it after returning from different activity..i.e. onResume of main activity it is showing size 0. Any ideas how this might be happening?

Answers

Add your model of setting you need:

public class SettingsModel {
    public String facebookToken;
    public String twitterToken;
    //... anything you need 
}

make Settings service and init it in Extended Application class as

new SettingsService();

SettingsService:

public class SettingsService {

    private static String KEY = "yourDesiredSettingsKey";
    private static Context mContext;

    public static SettingsModel settings;

    public SettingsService(){
        mContext = YourApplication.getMainContext();
        //if(settings == null){
        settings = getSettings();
        //}
    }

    public static void saveSettings(){
        if(settings == null){
            settings = new SettingsModel();
        }
        SharedPreferences.Editor editor = mContext
                .getSharedPreferences(KEY, Activity.MODE_PRIVATE).edit();
        Gson gson = new Gson();
        String jsonSettings = gson.toJson(settings);
        editor.putString("settings", jsonSettings );
        editor.commit();
        settings = getSettings();
    }


    public static SettingsModel getSettings() {
        SharedPreferences editor = mContext.getSharedPreferences(KEY,
                Activity.MODE_PRIVATE);
        try{
            String jsonSettings = editor.getString("settings","settings");
            Gson gson = new Gson();
            settings = gson.fromJson(jsonSettings, SettingsModel.class);
        }catch (Exception e){
            settings = new SettingsModel();
        }

        return settings;
    }


}

in gradle:

compile  com.google.code.gson:gson:2.4 

thats all, you can access your settings from anywhere with:

String token = SettingsService.settings.facebookToken;

or update them:

SettingsService.settings.facebookToken = "yourToken";
SettingsService.saveSettings();

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/37508206/global-variable-in-android-application-not-persisting

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils