1

AとBの2つのアクティビティがあります。

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でif(MyStaticVarz.myFlag)がfalseで、SomeTask()に到達していません。

次のようにAからBに移動します:

Intent i = new Intent(A.this, B.class);
startActivity(i);

UPDATE SomeTask()は、AおよびBのテキストのフォントサイズを変更するためのものです。

myFlagは、UIのオンデマンド再初期化用であり、フォント設定が変更された場合、SomeTask()が実行されます。

BのoptionMenuをクリックし、フォントサイズを変更して、Bに移動すると、変更が表示されますが、Aに戻ると、テキストフォントサイズは発生しません。

たぶん重要:Aに戻って、フォントサイズが正しくなく、myFlagもfalseの場合、向きを変更すると、テキストのfontsizeは正常ですが、myFlagは再びfalseになります。

4

4 に答える 4

4

異なるスレッドから「myFlag」変数にアクセスする場合、それぞれにローカルに保存されたコピーがある可能性があるため、変数の値の変更が異なるスレッドですぐに認識されない可能性があります。

変数をvolatileとして定義して、すべてのスレッドに同じコピーを表示させるようにします。

public static volatile boolean myFLag = false;

より詳細な説明については、この素晴らしい答えを参照してください

于 2012-11-11T08:09:39.797 に答える
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が変更される機会がないことを確認する必要があります。

于 2012-11-11T09:24:01.750 に答える
0

falseメンバーの初期値はありますか?おそらく、アプリケーションの変数がプロセス中にリセットされています。Androidを正しく覚えていれば、onResumeはアプリの終了の一部として呼び出すことができます。これにより、保存されていないデータがすべて破棄されることはほぼ間違いありません。その情報をバンドルに保存し、そこから復元する必要があります。

于 2012-11-11T07:54:32.150 に答える
0

答えは簡単です。inに変更MyStaticVarz.myFlagtruegetViewからアクティビティBに戻り、からへの変更onResume()の値で 、アクティビティAに戻ると、の値はそうではなく、アクティビティAが値を取得しないことは明らかです。MyStaticVarz.myFlagtruefalseMyStaticVarz.myFlagfalsetruetrue

この問題を解決するには、変更した値を保存する必要があります。

String value = entryValues[index].toString();

アクティビティAおよびBのイベントで、変更を理解するためにを確認static Stringしてください。MyStaticVarzonResume()static Stringlocal String

于 2012-11-11T09:38:41.217 に答える