-2

这是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();。我不知道为什么这会使我的应用程序崩溃。

4

1 回答 1

6

getSharedPreferences()是一种Context方法。如果save()在一个扩展的类中Context,例如Activity,你不必做context.getSharedPreferences(),所以你可以做,正如你所说的“方法本身”。

但是,如果 save不在extends 类中Context,为了能够调用getSharedPreferences()它,它需要Context传递一个变量。这意味着您通过简单地创建一个context变量所做的事情是不够的(并且该代码不应该编译,将会抛出一个关于context变量尚未初始化的错误)。而且由于Contexts 不是使用构造函数制作的,因此您的方法陷入了死胡同。

但是,你很接近。为了解释起见,您可以创建一个接受 aContext并进行保存的静态方法。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)。
  • FragmentStaticUtils.save(getActivity());
  • BroadcastReceiverStaticUtils.save(context);
  • A View(例如,当被调用View时传递:onClick()StaticUtils.save(v.getContext());

请记住,您可以在 Activity 中保存的最早可能是onCreate()之前的任何操作都将失败,并且 Exception 应该清楚地表明这一点。

一个简单的演示。没有扩展任何东西,没有花哨的制作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));
  }
}

静态工具.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();
    }
}
于 2013-02-20T00:06:55.817 回答