Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用非最终静态变量的情况下从非上下文类获取SharedReference?_Java_Android_Sharedpreferences_Static Methods_Static Members - Fatal编程技术网

Java 如何在不使用非最终静态变量的情况下从非上下文类获取SharedReference?

Java 如何在不使用非最终静态变量的情况下从非上下文类获取SharedReference?,java,android,sharedpreferences,static-methods,static-members,Java,Android,Sharedpreferences,Static Methods,Static Members,我需要从名为a的抽象类中获取对共享pref的引用,该抽象类不扩展任何内容 我无法将Context对象传递给这个类来获取共享的pref,因为它是抽象的,我没有实例化它。我创建了一个类A,由共享单个属性的其他POJO扩展,该属性是uuid。UUID在第一次运行时在应用程序中生成一次,这就是我将其存储在共享pref中的原因。在类A的构造函数中,我希望根据共享prefs中的内容设置uuid public abstract class A { private String uuid; pu

我需要从名为
a
的抽象类中获取对共享pref的引用,该抽象类不扩展任何内容

我无法将
Context
对象传递给这个类来获取共享的pref,因为它是抽象的,我没有实例化它。我创建了一个类
A
,由共享单个属性的其他POJO扩展,该属性是
uuid
。UUID在第一次运行时在应用程序中生成一次,这就是我将其存储在共享pref中的原因。在类
A
的构造函数中,我希望根据共享prefs中的内容设置
uuid

public abstract class A {
    private String uuid;
    public A() {
        // this is how I'm hoping to use the shared preferences
        this.uuid = sharedPrefs.getString("KEY_UUID", "null");
    }
    // getter and setter
}
是扩展
应用程序
,比如在名为
App
的类中,并在清单中的
标记中包含一个属性
android:name=“.App”
。我想
App
会这样写:

public class App extends Application {
    private static App app;
    public void onCreate() {
        this.app = this;
    }
    public static App getApp() {
        return app;
    }
}
public class App extends Application
{
    private static Context context;

    @Override
    public void onCreate()
    {
        super.onCreate();
        App.context = getApplicationContext();
    }

    public static Context getStaticContext()
    {
        return App.context;
    }
}
…以便从类
A
内部执行以下操作:

this.uuid = App.getApp().getSharedPreferences("prefs_name.txt", Context.MODE_PRIVATE).getString("KEY_UUID", "null");
但是,非最终静态字段
app
是否会丢失对
app
的引用,并在Android关闭进程或手机重新启动时变为空?如果不使用此方法,如何获取对共享pref的引用?还是应该手动将UUID写入文件

我无法将上下文对象传递给此类以获取共享的pref,因为作为抽象对象,我没有实例化它

当然可以。将
Context
作为参数放在构造函数上。或者,如果愿意,将
SharedReferences
作为参数放在构造函数上。子类的构造函数将需要获取相同的参数并将其传递给
super()
调用

然而,当Android关闭进程或手机重启时,非最终静态字段应用程序是否会丢失对应用程序的引用并变为空


整个过程都结束了。说它“失去了对应用程序的引用并变为空”类似于说一个人在核爆炸的地面零点会在蒸发之前被晒伤——虽然可能是真的,但这一点有点没有意义。:-)

将应用程序类修改为以下内容:

public class App extends Application {
    private static App app;
    public void onCreate() {
        this.app = this;
    }
    public static App getApp() {
        return app;
    }
}
public class App extends Application
{
    private static Context context;

    @Override
    public void onCreate()
    {
        super.onCreate();
        App.context = getApplicationContext();
    }

    public static Context getStaticContext()
    {
        return App.context;
    }
}

我担心从实例化子POJO的活动和服务中传递
这个
,然后将其传递给
A
不是一个好的设计。但我想我没有太多选择。@MattQuiros:那就不要通过
这个
。传递
SharedReferences
。或者,更好的方法是传递实际的UUID字符串。或者,更好的是,如果此UUID在整个过程中是唯一的(“UUID在应用程序第一次运行时在应用程序中生成一次,这就是我将其存储在共享pref中的原因”),则将其放入静态数据成员中,并跳过在每个POJO中加载。UUID实际上是应用程序安装的唯一标识符,因此,除非用户卸载并重新安装应用程序,否则不应再次生成该应用程序。所以我想我不能做你最后的建议,而只是传递UUID,而不是
this
SharedReferences
@MattQuiros:“所以我想我不能做你最后的建议”——我最后的建议是将UUID缓存在静态数据成员中。你当然可以做到。在开始创建POJO之前,只需从
SharedReferences
初始化该静态数据成员。为了在第一次运行时创建UUID,您必须在任何POJO检查之前进行一次检查,所以此时只需将新的或现有的UUID存储在静态数据成员中即可。顺便说一句,请记住,对于Android 4.2+上相同设备的不同用户,您的UUID将不同。感谢4.2上的提醒,但是如果我将UUID存储在静态数据成员中,当进程终止或手机重新启动时,它将返回到其原始状态。我刚刚测试了它,将一个全局静态
int
初始化为
-1
,并在活动中增加其值。当我重新启动手机并再次启动应用程序时,
int
的值回到
-1
。我希望我正确地理解了你的意思?这不是和问题中的
应用程序的效果一样吗?试试这个