按下后退后全局变量丢失的 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();

让你的ApplicationclassSingleton。像这样:

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