1

I'm using SharedPreferences, to store my game content, like items you have, your current gold, items equiped and etc.

Without using the SharedPreferences I get 25 to 27 MB heap, but when I use it, I'm getting 32 MB heap, it's increasing 5MB. Is it normal or am I doing something wrong?

package Util;
import android.app.Activity;

public class StorageInfo {
    public static StorageInfoHelper storage;
    public Activity _context;
    public StorageInfo (Activity context){
        _context = context;
        storage = new StorageInfoHelper(_context);
        storage.reset();
    }
}

package Util;

import android.app.Activity;
import android.content.SharedPreferences;


public class StorageInfoHelper {
    public static final String GoldKEY = "Gold";
    public static final String EquipedItensKEY = "EquipedItens";
    public static final String MyHeadItensKEY = "MyHeadItens";
    public static final String MyPowerUpItensKEY = "MyPowerUpItens";
    public static final String MyBodyItensKEY = "MyBodyItens";
    public static final String MyBoardItensKEY = "MyBoardItens";
    public static final String splitDefault = ",";
    public static final String goldDefault = "0";
    public static final String itenDefault = "0";
    public static final String equipItensDefault = "0,0,0,0";
    private static final int headCNT = 0;
    private static final int PowerUpCNT = 1;
    private static final int bodyCNT = 2;
    private static final int boardCNT = 3;
    private String myHead = new String();
    private String myPowerUp = new String();
    private String myBoard = new String();
    private String myBody = new String();
    private String myEquipedHead = new String();
    private String myEquipedPowerUp = new String();
    private String myEquipedBoard = new String();
    private String myEquipedBody = new String();
    private String myEquipedItens = new String();
    private SharedPreferences settings;
    private SharedPreferences.Editor editor;
    private Activity context;

    public StorageInfoHelper (Activity mycontext){
        context = mycontext;
    }

    private SharedPreferences getPreferences (){
        synchronized (StorageInfoHelper.class){
            if (settings != null){
                return settings;
            }else {
                settings = context.getPreferences(0);
                return settings; 
            }
        }
    }

    private SharedPreferences.Editor getEditor (){
        synchronized (StorageInfoHelper.class){
            if (editor != null){
                return editor;
            }else {
                editor = getPreferences().edit();
                return editor; 
            }
        }
    }

    protected String getStoredFiles(String key){
       // Restore preferences
       return settings.getString(key, new String());
    }

    protected void saveStoredFiles(String key, String value){
      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      getEditor().putString(key, value);

      // Commit the edits!
      getEditor().commit();
    }

    public String getMyGold (){
        return getPreferences().getString(GoldKEY, goldDefault);
    }

    public String addGold (int value){
         getEditor().putString(GoldKEY, String.valueOf(Long.decode(getMyGold()) + value));
         getEditor().commit();
        return getMyGold();
    }

    public String getMyEquipedItens (){
        myEquipedItens = getPreferences().getString(EquipedItensKEY, equipItensDefault);
        return myEquipedItens;
    }

    public void setMyEquipedItens (String equipedItens){
        getEditor().putString(EquipedItensKEY, equipedItens);
        getEditor().commit();
        myEquipedItens = equipedItens;
    }

    public String getMyEquipedHead (){
        myEquipedItens = getMyEquipedItens();
        myEquipedHead = myEquipedItens.split(splitDefault)[headCNT];
        return myEquipedHead;
    }

    public void setMyEquipedHead (String head){
        myEquipedItens = getMyEquipedItens();
        myEquipedPowerUp = myEquipedItens.split(splitDefault)[PowerUpCNT];      
        myEquipedBody = myEquipedItens.split(splitDefault)[bodyCNT];
        myEquipedBoard = myEquipedItens.split(splitDefault)[boardCNT];
        myEquipedItens = head + splitDefault + myEquipedPowerUp + splitDefault + myEquipedBody + splitDefault + myEquipedBoard;
        setMyEquipedItens(myEquipedItens);
    }

    public String getMyEquipedPowerUp (){
        myEquipedItens = getMyEquipedItens();
        myEquipedPowerUp = myEquipedItens.split(splitDefault)[PowerUpCNT];
        return myEquipedPowerUp;
    }

    public void setMyEquipedPowerUp (String PowerUp){
        myEquipedItens = getMyEquipedItens();
        myEquipedHead = myEquipedItens.split(splitDefault)[headCNT];        
        myEquipedBody = myEquipedItens.split(splitDefault)[bodyCNT];
        myEquipedBoard = myEquipedItens.split(splitDefault)[boardCNT];
        myEquipedItens = myEquipedHead + splitDefault + PowerUp + splitDefault + myEquipedBody + splitDefault + myEquipedBoard;
        setMyEquipedItens(myEquipedItens);
    }

    public String getMyEquipedBoard (){
        myEquipedItens = getMyEquipedItens();
        myEquipedBoard = myEquipedItens.split(splitDefault)[boardCNT];
        return myEquipedBoard;
    }

    public void setMyEquipedBoard (String board){
        myEquipedItens = getMyEquipedItens();
        myEquipedHead = myEquipedItens.split(splitDefault)[headCNT];
        myEquipedPowerUp = myEquipedItens.split(splitDefault)[PowerUpCNT];      
        myEquipedBody = myEquipedItens.split(splitDefault)[bodyCNT];
        myEquipedItens = myEquipedHead + splitDefault + myEquipedPowerUp + splitDefault + myEquipedBody + splitDefault + board;
        setMyEquipedItens(myEquipedItens);
    }

    public String getMyEquipedBody () {
        myEquipedItens = getMyEquipedItens();
        myEquipedBody = myEquipedItens.split(splitDefault)[bodyCNT];
        return myEquipedBody;
    }

    public void setMyEquipedBody (String body){
        myEquipedItens = getMyEquipedItens();
        myEquipedHead = myEquipedItens.split(splitDefault)[headCNT];
        myEquipedPowerUp = myEquipedItens.split(splitDefault)[PowerUpCNT];      
        myEquipedBoard = myEquipedItens.split(splitDefault)[boardCNT];
        myEquipedItens = myEquipedHead + splitDefault + myEquipedPowerUp + splitDefault + body + splitDefault + myEquipedBoard;
        setMyEquipedItens(myEquipedItens);
    }

    public String getMyHeads (){
        myHead = getPreferences().getString(MyHeadItensKEY, itenDefault);
        return  myHead;
    }

    public void addInMyHeads (String head) {
        myHead = getPreferences().getString(MyHeadItensKEY, itenDefault);
        myHead = myHead + splitDefault + head;
        getEditor().putString(MyHeadItensKEY, myHead);
        getEditor().commit();
    }

    public String getMyPowerUps (){
        myPowerUp = getPreferences().getString(MyPowerUpItensKEY, itenDefault);
        return myPowerUp;
    }

    public void addInMyPowerUps (String PowerUp) {
        myPowerUp = getPreferences().getString(MyPowerUpItensKEY, itenDefault);
        myPowerUp = myPowerUp + splitDefault + PowerUp;
        getEditor().putString(MyPowerUpItensKEY, myPowerUp);
        getEditor().commit();
    }

    public String getMyBoards (){
        myBoard = getPreferences().getString(MyBoardItensKEY, itenDefault);
        return myBoard;
    }

    public void addInMyBoard (String board) {
        myBoard = getPreferences().getString(MyBoardItensKEY, itenDefault);
        myBoard = myBoard + splitDefault + board;
        getEditor().putString(MyBoardItensKEY, myBoard);
        getEditor().commit();
    }

    public String getMyBodys (){
        myBody = getPreferences().getString(MyBodyItensKEY, itenDefault);
        return myBody;
    }

    public void addInMybodys (String body) {
        myBody = getPreferences().getString(MyBodyItensKEY, itenDefault);
        myBody = myBody + splitDefault + body;
        getEditor().putString(MyBodyItensKEY, myBody);
        getEditor().commit();
    }

    public void reset() {
         getEditor().clear();
         editor.commit();

    }

}

I initiate the StorageInfo, only once, when the app starts:

 public class Splash extends Activity {
ImageView imgDuck;
 public void onCreate(Bundle savedInstanceState) {   
     super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        setContentView(R.layout.splash);

        FadeInDuck();
        new StorageInfo(this);

 }
}

And I use it in this way:

Util.MyTextView imgView = (Util.MyTextView) findViewById(R.id.txtCoins);       
        imgView.setText(StorageInfo.storage.getMyGold());

I'm calling that from different Contexts (net.ui and net.game). Is it a problem?

trincot
  • 317,000
  • 35
  • 244
  • 286
Moondustt
  • 864
  • 1
  • 11
  • 30
  • You're just storing several `Strings` an`d ome `Ints`, this file should not be that big (5 MB). On the other hand, could you confirm that the `SharedPreferences` file is that big (I mean look it up on the storage)? If it gets that big, then you'll probably need t use SQLite to store those results, gold etc. – g00dy Aug 23 '13 at 12:08
  • How can I get to the file? – Moondustt Aug 23 '13 at 12:09
  • You can find the file anywhere in the application's components, or if it's not private - > `/data/data/Util/shared_prefs/preference_filename.xml` or `/data/data/Util/shared_prefs/Util_preferences.xml`. – g00dy Aug 23 '13 at 12:15

2 Answers2

0

I believe its a known thing if you are storing many different values within Shared Preferences.

It may be better to store the data within the SQLite database.

Boardy
  • 35,417
  • 104
  • 256
  • 447
  • well, it's not many values.. basically: YourCurrentMoney = String YourCurrentHead = String with commas (max 7 itens) YourCurrentBody = String with commas (max 7 itens) YourCurrentBoard = String with commas (max 7 itens) – Moondustt Aug 23 '13 at 13:57
0

According to this answer, SharedPreference is stored in Memory once it is loaded, inside Context (will get removed once that specific Context is destroyed)

Jemshit
  • 9,501
  • 5
  • 69
  • 106