在应用程序中使用 SharedPreferences 数据 class

Using SharedPreferences data in Application class

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

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();

但是有一个小问题促使我 post 这个问题,当我在应用程序 class 中调用 SharedPreferences 时,你能看到吗?我这样做是因为我需要发送会话令牌和用户帐户 ID 以正确启动与我的服务器的套接字连接,问题是:

假设一个用户第一次打开应用,还没有账户,他会登录或注册,然后会话令牌和用户 ID 将被保存到 SharedPreferences,但是当应用启动并且 运行 应用程序 class、SharedPreferences 仍然是空的 并且没有建立连接所需的令牌和用户 ID,因此用户必须重新打开应用程序现在可以成功使用套接字了。

所以我问你:我有哪些解决问题的替代方案? 除了应用程序 class 之外,还有其他结构可以避免我的痛苦吗?这个问题?或者有什么方法可以绕过这个问题吗?

我现在正在做的解决这个问题的方法是在登录时以编程方式重新启动应用程序,但我认为这看起来像是一个悲伤的笑话,而不是理想的方式。

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

将您的 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: 没有有效的 settionTokenuserId, soket 为 null

这是完整的申请 class:

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;
    }
}