我需要在我的一个安卓应用程序中使用静态堆栈。这是我如何使用它:
在常量文件中:
public static Stack<String> st = new Stack<String>();
在活动文件中,在 onBackPress 方法中使用以下逻辑:
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()函数)不起作用。以下是上述逻辑的日志:
: 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..函数包含在同一活动上显示的不同动态创建的表单时。现在,当我们输入/显示任何方法/表单时,其名称即UI。在堆栈中推送。
PPS:我对反对票很好,但一个简单的解释会很有帮助。
PPPS:EJB似乎在假设我在假设:-)。我将再次尝试解释到底发生了什么:我有一个活动,我选择展示各种形式,但一次一个。每种方法UI_First...表示一种形式。现在发生的情况是,有时其中一个表单会从显示中跳过,因为它不包含视图,例如UI_Second......所以在UI_First之后...将显示UI_Third窗体。现在当用户按下后退按钮时,理想的情况是程序将跳过UI_Second。(因为它不包含视图)并打开UI_First...为了实现此功能,我使用了一个堆栈,每当显示表单时,即当UI_First...方法被称为它的名字被推送到堆栈中。当按下后退按钮时,它会弹出。如果我不够清楚,我深表歉意。
PPPPS:我在10分钟前遇到了问题。 这正是普拉蒂克在答案中所说的,所以我将接受他的回答。
是否有任何其他线程同时将字符串推送到堆栈上。最初,您弹出的字符串"UI_FirstActivity"。大约在同一时间,一些线程正在推送新的字符串。因此,当您执行第二次弹出时,另一个线程必须再次推送相同的字符串
我想它工作正常。这是我的理解,在第一次回压时,
[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.
如果我误解了你的问题,请纠正我。