Question

I have a Activity class from where I am passing some information to a helper class(Non-activity) class. In the helper class I want to use the getSharedPreferences(). But I am unable to use it as it requires the activity context.

here is my code:

  class myActivity extends Activity
    {
    @Override
        protected void onCreate(Bundle savedInstanceState) 
        {

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home);


            Info = new Authenticate().execute(ContentString).get();
            ItemsStore.SetItems(Info);

        }

    }

class ItemsStore
{
  public void SetItems(Information info)
 {
  SharedPreferences  localSettings = mContext.getSharedPreferences("FileName", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
 }
}

ANy idea how this can be achieved?

Was it helpful?

Solution 2

Try this:

class myActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);


        Info = new Authenticate().execute(ContentString).get();
        ItemsStore.SetItems(Info, getApplicationContext());

    }

}

class ItemsStore
{
   public void SetItems(Information info, Context mContext)
   {
            SharedPreferences  localSettings = mContext.getSharedPreferences("FileName",
            Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
   }
}

OTHER TIPS

Instead of creating memory leaks (by holding activity context in a class field) you can try this solution because shared preferences do not need activity context but ... any context :) For long living objects you should use ApplicationContext.

Create the application class:

public class MySuperAppApplication extends Application {
    private static Application instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static Context getContext() {
        return instance.getApplicationContext();
    }
}

Register it at manifest

<application
    ...
    android:name=".MySuperAppApplication" >
    ...
</application>

Then you can do something like this

public void persistItems(Information info) {
    Context context = MySuperAppApplication.getContext();
    SharedPreferences sharedPreferences = context.getSharedPreferences("urlPersistencePreferences", Context.MODE_PRIVATE);
    sharedPreferences.edit()
        .putString("Url", info.Url)
        .putString("Email", info.Email);
}

Method signature looks better this way because it does not need external context. This can be hide under some interface. You can also use it easily for dependency injection.

HTH

You need to pass the context to the constructor of non activity class

ItemsStore itemstore = new ItemStore(myActivity.this);
itemstore.SetItems(Info);

Then

Context mContext;
public ItemsStore (Context context)
{
       mContext =context;
}

Now mContext can be used as Activity Context.

Note: Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)

Write a public function in your activity. While creating an instance of your helper class in Activity class, pass the context of activity in constructor.

Then from your helper class, using the activity context, call the public function in activity class.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top