【问题标题】:Cannot pop() more than once from the static stack [closed]不能从静态堆栈中多次弹出()[关闭]
【发布时间】:2013-09-18 05:26:12
【问题描述】:

我需要在我的一个 android 应用程序中使用静态堆栈。 这是我的使用方法:

在常量文件中:

public static Stack<String> st = new Stack<String>();

而在Activity File中,在onBackPressed方法内部使用了以下逻辑:

if (!Constants.st.isEmpty()) {
    Log.i("CHECK", "Stack is not empty.");
    Log.v("CHECK", "PEEK: " + Constants.st.peek()); 
    Constants.st.pop();
    if(Constants.st.isEmpty()){
        Log.i("CHECK", "Stack is empty.");
    }else{
        Log.v("CHECK", "PEEK after POP: " + Constants.st.peek());
    }
}else{
    Log.i("CHECK", "Stack is empty.");
}

现在,当我按下后退按钮时(我的意思是 pop() 函数有效),然后第二次(pop() 函数)不起作用。 以下是上述逻辑的Log:

: Stack is not empty.
: PEEK: UI_FirstActivity
: Stack is empty.
: Stack is not empty.
: PEEK: UI_SecondActivity
: PEEK after POP: UI_FirstActivity
: Stack is not empty.
: PEEK: UI_FirstActivity
: PEEK after POP: UI_FirstActivity

PS:另一件事是,每当所有这些 UI.. 函数包含不同的动态创建的表单时,都会显示在同一个 Activity 上。现在,当我们输入/显示任何方法/表单时,它的名称,即 UI.. 被推入堆栈。

PPS:我同意投反对票,但简单的解释会很有帮助。

PPPS:似乎 EJB 假设我假设 :-)。 我将再次尝试解释到底发生了什么: 我有一个活动,我选择在其中显示各种形式,但一次显示一个。 每个方法 UI_First... 代表一种形式。现在发生的情况是,有时其中一个表单被跳过显示,因为它不包含任何视图,例如 UI_Second... 所以在 UI_First... UI_Third 表单显示之后。现在,当用户按下后退按钮时,理想的情况是程序将跳过 UI_Second..(因为它不包含视图)并打开 UI_First...为了实现此功能,我使用了一个堆栈,每当显示表单时,即当 UI_First ...方法被调用,它的名字被压入堆栈。当按下后退按钮时,它会弹出。如果我不够清楚,我很抱歉。

PPPPS:我在 10 分钟前遇到了问题。这正是 pratik 在回答中所说的,所以我将接受他的回答。

【问题讨论】:

  • 您似乎从不推动任何东西,因此您可以弹出任何东西令人惊讶。显然,当您第二次弹出时,堆栈上没有任何内容。您的代码不完整,无法进一步评论。
  • @EJP 我已经更新了推送部分。
  • 您发布的代码中没有“推送”。
  • @EJP 请阅读问题。尤其是 PS 部分。
  • 请阅读执行推送的代码部分并告诉我它在哪里。我看不到它。我只能看到您的 假设 正在推动某些事情。 显然这个假设是错误的:问题是,为什么?这只能通过检查您宝贵的密码来回答。

标签: java android stack


【解决方案1】:

是否有任何其他线程同时将字符串推入堆栈。最初只有一个字符串“UI_FirstActivity”弹出。大约在同一时间,一些线程正在推送新的字符串。因此,当您执行第二次弹出时,另一个线程必须再次推送相同的字符串

【讨论】:

  • 我正在编辑问题以澄清这一点。谢谢。
  • 我在推送之前添加了一个检查(如果堆栈中已经存在该值)。它解决了问题。
【解决方案2】:

我想它工作正常。这是我的理解,在你第一次背压时,

[UI_FirstActivity] alone and it pops making the stack empty.

但是第二次你有,

[UI_SecondActivity,UI_FirstActivity] so it pops UI_SecondActivity alone you have 1 item in stack still.

如果我误解了你的问题,请纠正我。

【讨论】:

  • 是的,但在第二次回击之后,它应该弹出 UI_FirstActivity 而它没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多