使用getSharedPreferences android?

时间:2013-02-19 22:55:46

标签: android sharedpreferences

这是我的应用中的save()方法:

public void save() {
    Context context;
    SharedPreferences sp = context.getSharedPreferences("gameSave",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
    editor.commit();
}

我一直试图让它工作一段时间,但getSharedPreferences (String name, int mode)并没有为我工作。它没有自己出现,context.getSharedPreferences()有效,但由于我的背景,我认为这会产生NullPointerException。我已经尝试save(Context context){}作为构造函数,但是从该方法内部声明的上下文的另一个方法调用它也不起作用。我看了很多例子,但没有一个能为我效劳。那么我怎样才能让getSharedPreferences()工作?

编辑:我有一个GameScreen类和一个SaveManager类。当我在Gamescreen中保存时,这是我使用的代码:

Savemanager savemanager;
savemanager.save();
state = GameState.Running;

我有我的班级SaveManager:

package com.package.game;

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

public class SaveManager extends Activity {

private Player player = GameScreen.getPlayer();

public void save() {
    SharedPreferences sp = getSharedPreferences("gameSave",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
}
}

当我在GameScreen中保存时,我的应用程序崩溃了,我得到了这个logcat:

02-20 01:39:31.979: E/AndroidRuntime(1368): FATAL EXCEPTION: Thread-119
02-20 01:39:31.979: E/AndroidRuntime(1368): java.lang.NullPointerException
02-20 01:39:31.979: E/AndroidRuntime(1368): at com.package.game.GameScreen.updateLevelUp(GameScreen.java:364)

第364行是savemanager.save();行。我不知道为什么会崩溃我的应用程序。

1 个答案:

答案 0 :(得分:6)

getSharedPreferences()是一种Context方法。如果save()位于Context扩展Activity的类中,则您不必执行context.getSharedPreferences(),因此您可以这样做,因为您可以“方法本身“。

但是,如果在扩展Context的类中保存不是,为了能够调用getSharedPreferences(),则需要Context传递的变量。这意味着你通过简单地创建一个context变量而做的事情是不够的(并且该代码不应该编译,将会出现关于context变量如何未被初始化的错误)。由于Context不是使用构造函数创建的,因此您的方法会遇到死胡同。

然而,你很接近。为了便于说明,您可以创建一个在Context中接受并执行保存的静态方法。 static因为此方法实际上不需要对象实例,所以它可以是自包含的:

public static void save(Context context) {

    if (context == null)
      throw new RuntimeException ("Context is null, what are you doing?");

    SharedPreferences sp = context.getSharedPreferences("gameSave",
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putInt("X", player.getX());
    editor.putInt("Y", player.getY());
    editor.putInt("level", player.getLevel());
    editor.putFloat("xp", player.getXp());
    editor.commit();
}

现在,如果此方法是类的一部分,例如名为StaticUtils,则可以调用save:

  • 通过ActivityStaticUtils.save(YourActivityClass.this);StaticUtils.save(this);取决于范围(例如,如果在匿名内部函数内部,则使用YourActivityClass.this)。
  • FragmentStaticUtils.save(getActivity());
  • BroadcastReceiverStaticUtils.save(context);
  • View(例如,View被调用时传递的onClick()StaticUtils.save(v.getContext());

请记住,您可以在活动中保存最快的是onCreate()之前的任何事情都会失败,并且异常应该明确指出。

一个简单的演示。没有任何扩展,没有花哨的Context

MainActivity.java:

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     StaticUtils.save(this);

     SharedPreferences prefs = getSharedPreferences ("gameSave", Context.MODE_PRIVATE);
     System.out.println ("X is " + prefs.getInt ("X",-1));
  }
}

StaticUtils.java

public class StaticUtils {
    public static void save(Context context) {

        if (context == null)
          throw new RuntimeException ("Context is null, what are you doing?");

        SharedPreferences sp = context.getSharedPreferences("gameSave",
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        editor.putInt("X", 11);
        editor.putInt("Y", 24);
        editor.putInt("level", 3);
        editor.putFloat("xp", 100);
        editor.commit();
    }
}