按下后退后全局变量丢失的 ApplicationContext
ApplicationContext with global variable lost after back pressed
我在一个名为 Controller
的全局 class 中声明的全局变量有点问题,它从应用程序扩展。
当我开始时 Activity A 我在 Controller
中有一个包含 0 个项目的数组列表(这是一个购物车),我继续 activity B,点击后,我将一个项目添加到"Controller",我在 activity A 上返回(使用后退按钮),但我得到的数组列表仍然为 0 项,这是怎么回事?
我的控制器class:
public class Controller extends Application {
public static final int SIGNUP_REQUEST = 98; // The request code
public static final int SIGNIN_REQUEST = 99;
private User mUser;// Instance de l'utilisateur connecté
private Cart mCart = new Cart(); // Panier
private Tracker mTracker; // Analytics
private Session mSession;
private SessionModule mSessionModule;
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
mSessionModule = new SessionModule(base);
mSession = mSessionModule.getSession();
}
public Cart getCart() {
return mCart;
}
public Session getSession() {
return mSession;
}
public User getUser() {
return mUser;
}
public void setUser(User mUser) {
this.mUser = mUser;
}
}
我的购物车Class:
public class Cart {
private ArrayList<Item> items i= new ArrayList<Item>();
private Store mStore;
public Item getItem(int pPosition) {
return items.get(pPosition);
}
public void addItem(Item item) {
items.add(item);
}
public void removeItem(int pPosition) {
items.remove(pPosition);
}
public void clear() {
items.clear();
}
public int size() {
return items.size();
}
public ArrayList<Item> getItems() {
return items;
}
}
A BaseActivity 在 onCreate() 中获取控制器实例 :
public abstract class BaseActivity extends AppCompatActivity {
public Session mSession;
public Controller mController;
public static final int SIGNUP_REQUEST = 98; // The request code
public static final int SIGNIN_REQUEST = 99;
public static final int LOGIN_REQUEST = 1; // The request code
public static final int REGISTER_REQUEST = 2; // The request code
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mController=(Controller)getApplicationContext();
mSession=mController.getSession();
}
在 onResume()
调用的 MainActivity extends BaseActivity (Activity A)
中,我有一个刷新 UI 徽章的方法:
public void checkCartItems(){
if(itemCart!=null){
LayerDrawable iconCart = (LayerDrawable) itemCart.getIcon();
int nb_items=mController.getCart().size();
Tools.setBadgeCount(this, iconCart,String.valueOf(nb_items));
}
}
On Activity B extends BaseActivity onClick() 我调用一个简单的添加:
mController.getCart().addItem(mItem);
我会考虑对此类操作使用静态模式,以便 Cart 对象在应用程序的整个生命周期中都是相同的。
控制器的解决方案如下:
第 1 步:在控制器 class 内,将 Cart 设置为静态(将 Cart 的 getter 也修改为静态)
private static Cart mCart;
第二步:在Controller的onCreate中初始化实例
@Override
public void onCreate() {
super.onCreate();
mCart = new Cart();
}
如何使用:使用
从任何地方获取购物车
Controller.getCart();
让你的Application
classSingleton
。像这样:
public class Controller extends Application {
public static final int SIGNUP_REQUEST = 98; // The request code
public static final int SIGNIN_REQUEST = 99;
private User mUser;// Instance de l'utilisateur connecté
private Cart mCart = new Cart(); // Panier
private Tracker mTracker; // Analytics
private Session mSession;
private SessionModule mSessionModule;
private static Controller _mInstance;
@Override
public void onCreate() {
super.onCreate();
_mInstance = this;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
mSessionModule = new SessionModule(base);
mSession = mSessionModule.getSession();
}
public static synchronized Controller getInstance() {
return _mInstance;
}
public Cart getCart() {
return mCart;
}
public Session getSession() {
return mSession;
}
public User getUser() {
return mUser;
}
public void setUser(User mUser) {
this.mUser = mUser;
}
}
然后在使用 Application
class 的同时使用 Controller.getInstance().getCart().addItem(mItem);
我在一个名为 Controller
的全局 class 中声明的全局变量有点问题,它从应用程序扩展。
当我开始时 Activity A 我在 Controller
中有一个包含 0 个项目的数组列表(这是一个购物车),我继续 activity B,点击后,我将一个项目添加到"Controller",我在 activity A 上返回(使用后退按钮),但我得到的数组列表仍然为 0 项,这是怎么回事?
我的控制器class:
public class Controller extends Application {
public static final int SIGNUP_REQUEST = 98; // The request code
public static final int SIGNIN_REQUEST = 99;
private User mUser;// Instance de l'utilisateur connecté
private Cart mCart = new Cart(); // Panier
private Tracker mTracker; // Analytics
private Session mSession;
private SessionModule mSessionModule;
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
mSessionModule = new SessionModule(base);
mSession = mSessionModule.getSession();
}
public Cart getCart() {
return mCart;
}
public Session getSession() {
return mSession;
}
public User getUser() {
return mUser;
}
public void setUser(User mUser) {
this.mUser = mUser;
}
}
我的购物车Class:
public class Cart {
private ArrayList<Item> items i= new ArrayList<Item>();
private Store mStore;
public Item getItem(int pPosition) {
return items.get(pPosition);
}
public void addItem(Item item) {
items.add(item);
}
public void removeItem(int pPosition) {
items.remove(pPosition);
}
public void clear() {
items.clear();
}
public int size() {
return items.size();
}
public ArrayList<Item> getItems() {
return items;
}
}
A BaseActivity 在 onCreate() 中获取控制器实例 :
public abstract class BaseActivity extends AppCompatActivity {
public Session mSession;
public Controller mController;
public static final int SIGNUP_REQUEST = 98; // The request code
public static final int SIGNIN_REQUEST = 99;
public static final int LOGIN_REQUEST = 1; // The request code
public static final int REGISTER_REQUEST = 2; // The request code
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mController=(Controller)getApplicationContext();
mSession=mController.getSession();
}
在 onResume()
调用的 MainActivity extends BaseActivity (Activity A)
中,我有一个刷新 UI 徽章的方法:
public void checkCartItems(){
if(itemCart!=null){
LayerDrawable iconCart = (LayerDrawable) itemCart.getIcon();
int nb_items=mController.getCart().size();
Tools.setBadgeCount(this, iconCart,String.valueOf(nb_items));
}
}
On Activity B extends BaseActivity onClick() 我调用一个简单的添加:
mController.getCart().addItem(mItem);
我会考虑对此类操作使用静态模式,以便 Cart 对象在应用程序的整个生命周期中都是相同的。
控制器的解决方案如下:
第 1 步:在控制器 class 内,将 Cart 设置为静态(将 Cart 的 getter 也修改为静态)
private static Cart mCart;
第二步:在Controller的onCreate中初始化实例
@Override
public void onCreate() {
super.onCreate();
mCart = new Cart();
}
如何使用:使用
从任何地方获取购物车Controller.getCart();
让你的Application
classSingleton
。像这样:
public class Controller extends Application {
public static final int SIGNUP_REQUEST = 98; // The request code
public static final int SIGNIN_REQUEST = 99;
private User mUser;// Instance de l'utilisateur connecté
private Cart mCart = new Cart(); // Panier
private Tracker mTracker; // Analytics
private Session mSession;
private SessionModule mSessionModule;
private static Controller _mInstance;
@Override
public void onCreate() {
super.onCreate();
_mInstance = this;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
mSessionModule = new SessionModule(base);
mSession = mSessionModule.getSession();
}
public static synchronized Controller getInstance() {
return _mInstance;
}
public Cart getCart() {
return mCart;
}
public Session getSession() {
return mSession;
}
public User getUser() {
return mUser;
}
public void setUser(User mUser) {
this.mUser = mUser;
}
}
然后在使用 Application
class 的同时使用 Controller.getInstance().getCart().addItem(mItem);