我有这段代码......
class IncomingHandler extends Handler
{
@Override
public void handleMessage(Message message)
{
String totalReceived = (String) message.obj;
Log.i("TAG", "total received: " + totalReceived);
totalTextView.setText("" + totalReceived);
Log.i("TAG", (Looper.getMainLooper().getThread() == Thread.currentThread()) ? "UI thread" : "NOT UI thread");
//Toast.makeText(MainActivity.this, "message received.", Toast.LENGTH_LONG).show();
};
};
我运行我的应用程序并且它工作正常,但如果我重新创建活动,例如通过更改设备方向,文本将不会更新。请注意,我确实收到了消息,并且它们由LogCat成功打印。
另请注意,在我的上一次日志中,我尝试确定我是否在主线程上运行。如果检查是正确的,我确实在UI线程上运行......
关于我可能做错的任何想法?
干杯, 亚历
答案 0 :(得分:0)
因为lint建议处理程序应该是静态的,使处理程序静态并为活动创建weakReference
然后通过活动引用访问textview,我认为它应该工作
答案 1 :(得分:0)
尝试保存实例 添加这个
@Override
protected void onSaveInstanceState(Bundle outState) {
State s = new State(yourTextView.getText().toString());
outState.putSerializable(State.STATE, s);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
State s = (State) savedInstanceState.getSerializable(State.STATE);
yourTextView.setText(s.getYourTextViewText());
}
答案 2 :(得分:0)
您的问题是totalTextView
仍然指向(现已销毁的)之前活动的TextView。
如果class IncomingHandler
是活动的子类,那么确保在onCreate()
期间确保使用totalTextView = (TextView)findViewById(R.id.__/* something */__);
如果处理程序不是Activity的子类,那么也许它应该是,或者您应该查看更多Android-Framework-High-Level内容来更新和回调Activity(例如Loaders或UI-使用setRetainInstance(true);
)
ps:有些用户会告诉您只需将configChanged
放入清单中即可覆盖活动的销毁。虽然它可能在第一时间起作用,但这是一个糟糕的快速修复,这是一种不可取的模式,通常会在未来导致更大的问题。
来自:http://developer.android.com/guide/topics/manifest/activity-element.html#config
注意:应避免使用此属性,并仅将其用作 最后一招。有关更多信息,请阅读处理运行时更改 关于如何正确处理由于配置更改而导致的重启。