这是我的应用中的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();
行。我不知道为什么会崩溃我的应用程序。
答案 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:
Activity
:StaticUtils.save(YourActivityClass.this);
或StaticUtils.save(this);
取决于范围(例如,如果在匿名内部函数内部,则使用YourActivityClass.this
)。Fragment
:StaticUtils.save(getActivity());
BroadcastReceiver
:StaticUtils.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();
}
}