片段的上下文在作为参数传递时会“丢失”

时间:2015-06-22 19:59:06

标签: android

我在片段中遇到了一个非常尴尬的行为。 输出是:

this.userID: 0

RoomChatFragment userID: 14

但是在这种情况下,this.userID也应该是14.我的上下文丢失了什么,同时将其作为参数传递?我无法解释自己这种行为。我认为getActivity()不会返回null,否则会有例外。

    // Fragment
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        context = getActivity();
        user = new UserHandler(context);
        messageDatabase = MessageDatabase.getInstance(context);
        Log.i("debug", "RoomChatFragment userID: " + user.getUserID());
    }

// UserHandler
public class UserHandler {
    private final SharedPreferences sharedPrefs;
    private final SharedPreferences sharedPrefsPreferences;
    private Context context;

    public UserHandler(Context context) {
        sharedPrefs = context.getSharedPreferences("USER", 0);
        sharedPrefsPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        this.context = context;
    }

    public int getUserID() {
        return sharedPrefs.getInt("userID", 0);
    }

    public void setUserID(int userID) {
        SharedPreferences.Editor editor = sharedPrefs.edit();
        editor.putInt("userID", userID);
        editor.apply();
    }
}

// Database
public class MessageDatabase extends AbstractDatabase {
    private int userID;
    protected static MessageDatabase instance;

    public MessageDatabase(Context context) {
        super(context);
        UserHandler user = new UserHandler(context);
        userID = user.getUserID();
    }

    public static MessageDatabase getInstance(Context context) {
        if (MessageDatabase.instance == null) {
            MessageDatabase.instance = new MessageDatabase(context);
        }

        return MessageDatabase.instance;
    }

    // ....

    @Override
    protected Message cursorToObject(Cursor cursor) {
        Log.i("debug", "this.userID: " + this.userID);
    }
}

// AbstractDatabase
public abstract class AbstractDatabase {
    protected Context context;

    protected AbstractDatabase(Context context) {
        this.context = context;
    }
}

2 个答案:

答案 0 :(得分:1)

我不完全确定这里发生了什么(你的代码非常混乱)。但似乎你在偏好中使用了不同的键:

context.getSharedPreferences("USER", 0);
sharedPrefs.getInt("userID", 0);

答案 1 :(得分:0)

愚蠢的我!问题是我的数据库设计的单例设计模式。我的MessageDatabase.instance已缓存并包含旧的Context对象,其中userID的{​​{1}}为0。

我已经像这样更新了我的方法,似乎有效:

SharedPreferences