我有两个活动A和B.
public class A extends Activity
{
....
@Override
protected void onResume()
{
super.onResume();
if(MyStaticVarz.myFlag)
{
MyStaticVarz.myFlag= false;
SomeTask();
}
}
MyStaticVarz.java:
public class MyStaticVarz
{
public static boolean myFLag = false;
}
从A到B并将myFlag更改为true,如:
MyStaticVarz.myFlag = true;
再次返回A,但在onResume中,如果(MyStaticVarz.myFlag)为false且未达到SomeTask()。
从A到B,如:
Intent i = new Intent(A.this, B.class);
startActivity(i);
更新 SomeTask()用于更改A和B中文本的字体大小。
myFlag用于按需重新初始化UI,如果字体设置发生变化,则SomeTask()会运行。
单击B中的optionMenu并更改字体大小,然后转到B,我会看到更改,但是当返回到A时,文本字体大小不会发生。
也许很重要:当我回到A并且字体大小不合适且myFlag也是假的时候,如果我改变了oriantation,文字fontsize就可以了,但myFlag又是假的!
答案 0 :(得分:4)
如果从不同的线程访问“myFlag”变量,每个都可能有一个本地存储的副本,因此不同的线程可能不会立即看到变量值的变化。
将变量定义为volatile以强制所有线程看到相同的副本:
public static volatile boolean myFLag = false;
有关更详细的说明,请参阅this nice answer
答案 1 :(得分:2)
因为您从2个线程访问代码中的单个静态变量,所以需要围绕该访问添加一些锁定。
我会看一下像:
public class MasterBB extends Activity
{
private final ReentrantLock lock = new ReentrantLock();
@Override
protected void onResume() {
super.onResume();
lock.lock();
try {
if(MyStaticVarz.myFlag) {
MyStaticVarz.myFlag= false;
SomeTask();
}
}
finally {
lock.unlock();
}
}
}
我担心我的Java有点生疏,可能会有更新的方式,但这是一般的想法。您需要确保在该代码块运行时myFlag没有机会被修改。
答案 2 :(得分:0)
false
是会员的初始值吗?也许您的应用程序的变量在此过程中被重置。如果我正确记住Android,onResume可以被称为应用终止的一部分,我几乎可以肯定会破坏你所有的非存储数据。您需要将该信息存储在Bundle中并从中恢复。
答案 3 :(得分:0)
您的答案很简单,当您在MyStaticVarz.myFlag
中将true
更改为getView
,然后返回活动B,onResume()
MyStaticVarz.myFlag
的值从true
更改为false
,当您返回到活动A时,MyStaticVarz.myFlag
的值为false
而不是true
,很明显活动A永远不会获得{ {1}}值。
要解决此问题,您必须保存更改的值:
true
转到String value = entryValues[index].toString();
中的static String
以及活动A和B MyStaticVarz
事件,请onResume()
与static String
一起了解更改。