Android:findViewById给了我错误的指针?

时间:2012-04-14 07:46:43

标签: android application-lifecycle

在我的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()时,更新ALLWAYS可以正常工作。

我有一个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开始的View的第一个实例(即使它的资源)一样,即使在旋转设备时实例化了一个新的View之后也是如此。也许LocationListener这样做是因为我还没有停止它。但每次旋转设备时停止并启动它似乎都很愚蠢!

1 个答案:

答案 0 :(得分:1)

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

如果以上不是原因,那么我需要有关locationListener的更多信息以及如何使用它来提供帮助。