静态变量在两个活动之间不起作用

时间:2012-11-11 07:50:03

标签: android android-activity static android-lifecycle

我有两个活动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又是假的!

4 个答案:

答案 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一起了解更改。