为 ParseUser 扩展应用程序 Class
Extend Application Class for ParseUser
我想扩展我的 Application
class 以便全局访问登录的 ParseUser
而无需重复调用 .getCurrentUser()
并访问它在每个 activity.
目前我的 Application
class 已经扩展到初始化 Parse 和 ParseFacebookUtils。根据 this thread,它说要在 Application
class 中创建 ParseUser
的实例,但我不确定该怎么做。
注意:我不想使用意图,因为 ParseUser 不可序列化。
感谢您的帮助。我看不出代码包含的相关性,但请询问您是否需要。
方法 ParseUser.getCurrentUser()
不执行任何网络操作,因此无法阻止 UI。它也是静态的,因此通过某种方式它已经为您提供了全局访问权限。
我认为在某处复制它的值不是最好的主意,它可能会导致错误
您可以做的是在现有应用程序中有 2 个属性 class。
- isLoggedIn(boolean) - 将其初始化为 false
- 用户(解析用户)
并放置 getter 和 setter。
当用户登录系统时,您可以将 isLoggedIn 设置为 true 并在 loginActivity 中也设置用户。假设扩展应用程序 class 是 MyApplication。
((MyApplication)getApplication).setIsLoggedIn(true)
((MyApplication)getApplication).setUser(parseUser)
.
之后您可以在其他活动中简单地检查 isLoggedIn 布尔值并执行必要的操作。
您可以通过以下方式检索设置的用户
ParseUser currentUser = ((MyApplication)getApplication).getUser()
希望对您有所帮助。
我已经实现了单例来解决我的问题。我已经扩展了应用程序 class 来初始化一个单例,这样无论 activity 是否被销毁,这个单例的实例都存在。我可以通过任何 activity 访问此实例,因此可以访问当前 ParseUser 的所有字段。
// 申请Class
public class Application extends android.app.Application{
@Override
public void onCreate() {
Parse.initialize(this, "redacted", "redacted");
ParseFacebookUtils.initialize(this);
initSingleton();
}
protected void initSingleton() {
ParseUserSingleton.initInstance();
}
}
// 单例Class
public class ParseUserSingleton {
private static ParseUserSingleton instance;
public ParseUser user;
public HashMap<String, String> userFields = new HashMap<>();
public static void initInstance() {
if (instance == null) {
// Create the instance
instance = new ParseUserSingleton();
}
}
public static ParseUserSingleton getInstance() {
// Return the instance
return instance;
}
private ParseUserSingleton() {
// Constructor hidden because this is a singleton
}
public void customSingletonMethod() {
try {
user = ParseUser.getCurrentUser().fetch();
} catch (ParseException e) {
e.printStackTrace();
}
userFields.put("name", user.get("availability").toString());
// repeat for other fields
}
}
// Activity访问
ParseUserSingleton.getInstance().customSingletonMethod();
userHashMap = ParseUserSingleton.getInstance().userFields;
我想扩展我的 Application
class 以便全局访问登录的 ParseUser
而无需重复调用 .getCurrentUser()
并访问它在每个 activity.
目前我的 Application
class 已经扩展到初始化 Parse 和 ParseFacebookUtils。根据 this thread,它说要在 Application
class 中创建 ParseUser
的实例,但我不确定该怎么做。
注意:我不想使用意图,因为 ParseUser 不可序列化。
感谢您的帮助。我看不出代码包含的相关性,但请询问您是否需要。
方法 ParseUser.getCurrentUser()
不执行任何网络操作,因此无法阻止 UI。它也是静态的,因此通过某种方式它已经为您提供了全局访问权限。
我认为在某处复制它的值不是最好的主意,它可能会导致错误
您可以做的是在现有应用程序中有 2 个属性 class。
- isLoggedIn(boolean) - 将其初始化为 false
- 用户(解析用户)
并放置 getter 和 setter。
当用户登录系统时,您可以将 isLoggedIn 设置为 true 并在 loginActivity 中也设置用户。假设扩展应用程序 class 是 MyApplication。
((MyApplication)getApplication).setIsLoggedIn(true)
((MyApplication)getApplication).setUser(parseUser)
.
之后您可以在其他活动中简单地检查 isLoggedIn 布尔值并执行必要的操作。
您可以通过以下方式检索设置的用户
ParseUser currentUser = ((MyApplication)getApplication).getUser()
希望对您有所帮助。
我已经实现了单例来解决我的问题。我已经扩展了应用程序 class 来初始化一个单例,这样无论 activity 是否被销毁,这个单例的实例都存在。我可以通过任何 activity 访问此实例,因此可以访问当前 ParseUser 的所有字段。
// 申请Class
public class Application extends android.app.Application{
@Override
public void onCreate() {
Parse.initialize(this, "redacted", "redacted");
ParseFacebookUtils.initialize(this);
initSingleton();
}
protected void initSingleton() {
ParseUserSingleton.initInstance();
}
}
// 单例Class
public class ParseUserSingleton {
private static ParseUserSingleton instance;
public ParseUser user;
public HashMap<String, String> userFields = new HashMap<>();
public static void initInstance() {
if (instance == null) {
// Create the instance
instance = new ParseUserSingleton();
}
}
public static ParseUserSingleton getInstance() {
// Return the instance
return instance;
}
private ParseUserSingleton() {
// Constructor hidden because this is a singleton
}
public void customSingletonMethod() {
try {
user = ParseUser.getCurrentUser().fetch();
} catch (ParseException e) {
e.printStackTrace();
}
userFields.put("name", user.get("availability").toString());
// repeat for other fields
}
}
// Activity访问
ParseUserSingleton.getInstance().customSingletonMethod();
userHashMap = ParseUserSingleton.getInstance().userFields;