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 返回旧指针值?

Spitballing:即使在设备旋转时实例化了新视图之后,从初始 onCreate 开始的视图的第一个实例就好像继续愉快地继续(连同它的资源)。也许 LocationListener 这样做是因为我没有停止它。但是每次旋转设备时停止和启动它似乎很愚蠢!

4

1 回答 1

1

我猜测 locationListener 是 Activity 的匿名内部类,这意味着它持有对其父类的引用。所以现在如果在 onCreate() 调用之后没有重新创建这个 locationListener,它将引用旧的 Activity,并且对 findViewById() 的调用将返回该旧 Activity 持有的对象。这不仅会导致您的程序执行不正确,还会导致内存泄漏(基本上原始 Activity 创建的所有内容都会被保留)。

如果上述不是原因,那么我将需要有关 locationListener 及其使用方式的更多信息以提供帮助。

于 2012-04-14T08:02:28.853 回答