Java 在应用程序类中使用SharedReferences数据

Java 在应用程序类中使用SharedReferences数据,java,android,socket.io,socket.io-java-client,Java,Android,Socket.io,Socket.io Java Client,我正在开发一个应用程序,我在上面使用Socket.io,我在一个扩展应用程序的类中初始化Socket,如下所示: public class Inicio extends Application{ private Socket mSocket; private SharedPreferences spref; @Override public void onCreate(){ super.onCreate(); try{

我正在开发一个应用程序,我在上面使用Socket.io,我在一个扩展应用程序的类中初始化Socket,如下所示:

public class Inicio extends Application{
    private Socket mSocket;
    private SharedPreferences spref;

    @Override
    public void onCreate(){
        super.onCreate();
        try{
            spref = getSharedPreferences("accountData", Context.MODE_PRIVATE);
            IO.Options op = new IO.Options();
            op.forceNew = true;
            op.reconnection = true;
            op.query = "tok=" + spref.getString("sessiontoken", "") + "&usr=" + spref.getString("userid", "");
            mSocket = IO.socket(Constants.serverAddress, op);
        }catch(URISyntaxException e){
            throw new RuntimeException(e);
        }
    }

    public Socket getmSocket(){
        return mSocket;
    }
}
因此,我可以通过以下方式在应用程序代码的其他部分中获取并使用相同的套接字实例:

Inicio appClass = (Inicio) getApplication();
mSocket = appClas.getmSocket();
mSocket.connect();
但是有一个小问题促使我提出这个问题,你能看到我在应用程序类中调用SharedReferences的时间吗?我这样做是因为我需要发送会话令牌和用户帐户ID以正确启动与服务器的套接字连接,问题是:

假设一个用户第一次打开应用程序并且还没有帐户,他将登录或注册,然后会话令牌和用户ID将保存到SharedReferences,但是当应用程序启动并运行应用程序类时,SharedReferences仍然为空,并且没有建立连接所需的令牌和用户ID,因此用户必须立即重新打开应用才能成功使用套接字

因此,我问您:我解决这个问题的备选方案是什么?除了应用程序类之外,还有其他结构可以让我避免这个问题吗?还是有什么方法可以绕过这个问题

我现在要做的是在登录时以编程方式重新启动应用程序,但我相信这看起来像一个悲伤的笑话,而不是理想的方式


谢谢,对于我这个冗长的问题,我深表歉意,但如果有任何帮助,我将不胜感激。

请将您的
soket
创建逻辑分开,如下所示:

private void createSoket() {
    spref = getSharedPreferences("accountData", Context.MODE_PRIVATE);
    String sessiontoken = spref.getString("sessiontoken", "");
    String userId = spref.getString("userid", "");

    if(!(TextUtils.isEmpty(sessiontoken) || TextUtils.isEmpty(userId))) {
        try {

            IO.Options op = new IO.Options();
            op.forceNew = true;
            op.reconnection = true;
            op.query = "tok=" + sessiontoken + "&usr=" + userId;
            mSocket = IO.socket(Constants.serverAddress, op);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}
需要时,请检查
null
并在传递实例之前创建

public Socket getmSocket(){
    if(mSoket == null)
        createSoket();

    return mSocket;
}
N.B:没有有效的
setiontoken
userId
soket
为空

这是完整的应用程序类:

public class Inicio extends Application{
    private Socket mSocket;
    private SharedPreferences spref;

    @Override
    public void onCreate(){
        super.onCreate();
        createSoket();
    }

    private void createSoket() {
        spref = getSharedPreferences("accountData", Context.MODE_PRIVATE);
        String sessiontoken = spref.getString("sessiontoken", "");
        String userId = spref.getString("userid", "");

        if(!(TextUtils.isEmpty(sessiontoken) || TextUtils.isEmpty(userId))) {
            try {

                IO.Options op = new IO.Options();
                op.forceNew = true;
                op.reconnection = true;
                op.query = "tok=" + sessiontoken + "&usr=" + userId;
                mSocket = IO.socket(Constants.serverAddress, op);
            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public Socket getmSocket(){
        if(mSoket == null)
            createSoket();

        return mSocket;
    }
}

从存储
sessiontoken
?@Md.Asaduzzaman的位置,它在用户登录期间成功存储,但正如我在应用程序类中所称,当应用程序第一次打开时,它是空的,然后用户需要登录并重新打开应用程序,然后它将始终工作。但是应用程序类在应用程序启动之前运行,因此用户需要将其重新打开到应用程序类以读取填充的SharedReferences。感谢您的回答,我将进行测试,然后在这里回复您。现在请使用您的
Inicio
类在我的回答中检查完整的应用程序类。欢迎使用。请张贴您的答案也。无论何时调用
getSoket()
if之前未初始化,我都需要将ideasket初始化。与应用程序类负载无关。应用程序类加载一次,但在关闭应用程序之前,它始终保持活动状态