1

我有这段代码...

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 线程上运行......

关于我可能做错了什么的任何想法?

干杯,亚历克斯

4

3 回答 3

1

您的问题是totalTextView仍然指向(现在已销毁)先前活动的 TextView。

如果class IncomingHandler是 Activity 的子类,那么确保在onCreate()您确保更新它的过程中应该很容易totalTextView = (TextView)findViewById(R.id.__/* something */__);

如果处理程序不是 Activity 的子类,那么也许它应该是,或者您应该查看更多 Android-Framework-High-Level 的东西来更新和回调 Activity(例如 Loaders 或 UI-less 片段setRetainInstance(true);)

ps.:有些用户会告诉你只需通过放入configChanged清单来覆盖 Activity 的销毁。虽然它可能在一开始就起作用,但它是一个糟糕的快速修复,这是一种不可取的模式,通常会在未来导致更大的问题。

来自:http: //developer.android.com/guide/topics/manifest/activity-element.html#config

注意:应避免使用此属性,并且仅将其用作最后的手段。有关如何正确处理由于配置更改而重新启动的更多信息,请阅读处理运行时更改。

于 2013-02-27T17:04:54.823 回答
0

由于 lint 建议处理程序应该是静态的,使处理程序静态并创建一个weakReference活动,然后通过活动引用访问 textview,我认为它应该可以工作

于 2013-02-27T16:39:59.403 回答
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());
 }
于 2013-02-27T16:42:13.873 回答