0

私の updateGUI() 関数では、各 TextView を次のように更新します。

((TextView) findViewById(R.id.lbTrackerLat)).setText(String.valueOf(lat));
((TextView) findViewById(R.id.lbTrackerLong)).setText(String.valueOf(lng));
((TextView) findViewById(R.id.lbTrackerAlt)).setText(String.valueOf(alt));

onCreate で onclick が割り当てられたボタンを押して updateGUI() を呼び出すと、更新は常に機能します。

ユーザーが別のボタンをクリックしたときに開始される locationListener があり、すべての更新イベントで updateGUI() も呼び出します。これは、画面が最初に回転するまで機能し、その後何らかの理由で画面が更新されません。

理由を突き止めようとしている間に、次のコードを updateGUI() 関数に追加しました。

TextView t = (TextView) findViewById(R.id.lbTrackerPostLastRefresh);
t.setText(formattedDate);
Log.d("H","EXIT  lbTrackerPostLastRefresh="+t.toString());

回転後 (onCreate が再度呼び出されます)、ボタン クリックから呼び出されると、ポインターとして 44c76a78 が取得されます。locationListener 更新関数が findVIewByID を呼び出すと、ポインター 44c1b518 が返されます!!??

レイアウトが破棄されて再作成されたことがわかりましたが、findViewById が古いポインター値を返すのはなぜですか??

スピットボール: デバイスがローテーションされたときに新しいビューがインスタンス化された後でも、最初の onCreate で始まるビューの最初のインスタンスが (そのリソースと共に) 陽気に続くかのようです。停止していないため、LocationListener がこれを実行している可能性があります。しかし、デバイスが回転するたびに停止して開始するのはばかげているようです!

4

1 に答える 1

1

locationListener はアクティビティの匿名の内部クラスであると推測しています。つまり、親クラスへの参照を保持しています。したがって、onCreate() の呼び出し後にこの locationListener が再作成されない場合、古いアクティビティが参照され、findViewById() の呼び出しによって、その古いアクティビティが保持するオブジェクトが返されます。これにより、プログラムが正しく実行されないだけでなく、メモリ リークも発生します (基本的に、元のアクティビティによって作成されたものはすべて保持されます)。

上記が原因でない場合は、locationListener とその使用方法に関する詳細情報が必要です。

于 2012-04-14T08:02:28.853 に答える