恢复行为后的Android Handler

时间:2014-04-30 20:50:39

标签: android handler android-lifecycle onresume android-handler

我有一个Android应用程序通过蓝牙接收消息(但这部分与此无关)。混乱是由处理程序接收的。在应用程序被Android任务管理器杀死后启动应用程序时,它可以正常工作。如果我不杀它并将它带回前面它就不会表现得那样。代码非常简单:

public class MainActivity extends Activity 
{

private BtBase mBtBase;
private TextView mTvBluetooth;
private View mView;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    mBtBase = BtBase.getInstance(this, mHandler);
    setContentView(R.layout.bluetooth);
}

@Override
protected void onResume()
{
    super.onResume();
    mTvBluetooth = (TextView) findViewById(R.id.tvBluetooth);
    if(mBtBase.getErrorCode() == BtLibraryConstants.BT_CONNECTED)
    {
        mTvBluetooth.setText("Text 1");
    }
    else
    {
        mTvBluetooth.setText("Text 2");
    }

}


private final Handler mHandler = new Handler() 
{
    @Override
    public void handleMessage(Message msg) 
    {
        switch(msg.what)
        {
        case 0:
            if(msg.arg2 == 0)
            {
                Toast.makeText(getApplicationContext(), "Text 1", Toast.LENGTH_LONG).show();
                mTvBluetooth.setText("Text 1.");
            }
            else if(msg.arg2 == 1)
            {
                Toast.makeText(getApplicationContext(), "Text 2", Toast.LENGTH_LONG).show();
                mTvBluetooth.setText("Text 2");
            }
            break;
        case 1:
            Toast.makeText(getApplicationContext(), (String) msg.obj, Toast.LENGTH_LONG).show();
            mTvBluetooth.setText("Text 3: " + (String) msg.obj);

            break;
        default:

        }
    }
};  
}

从简历情况开始应用后,有什么工作:

  • 处理程序中的Toast消息正确显示
  • onResume中的textview具有正确的值,具体取决于状态

从简历情况启动应用后,什么不起作用:

  • 处理程序中的文本视图更新无效。

请记住toast正常工作,因此执行代码。请记住,从任务管理器中删除应用程序后它可以正常工作,所以这并非完全错误。我认为它与生命周期管理有关。

我尝试了几件事

  • 将主循环器传递给处理程序,但是因为我从主线程创建处理程序所以它不是必需的
  • 获取主视图并在处理程序中使其无效以强制重绘

两者都没有奏效,但当然我可能在这些尝试中做错了。

调试器显示我的textView mTvBluetooth不是null,看起来它是我正在寻找的那个。但也许新的mTvBluetooth是以某种方式创建的,而我正在使用旧的mTvBluetooth。

最后但并非最不重要的是,logCat不会显示任何错误。

1 个答案:

答案 0 :(得分:0)

尝试移动此代码

mTvBluetooth = (TextView) findViewById(R.id.tvBluetooth);

onResume()onCreate()方法。也许有帮助。

此外,当以常见方式恢复活动时,不会重新创建TextView。 但有时可以销毁购买系统以获得更多内存。在这样的情况下,当您恢复活动时,必须在onCreate之前调用方法onResume

如果您不想移动代码,请尝试制作mTvBluetooth volatile。 尝试在调试时查看mHandler和onResume()中的mTvBlutooth值。 在eclipse中使用“Inspect”工具(Ctrl + Shift + I),你会看到一个变量id,例如: 830032407656.在这两个时刻检查ID。

请留下评论,这是一个有用的答案。