这个问题,在极少情况下可能会遇到,下面会有可能有效的解决方法,但是其中原理还不知道。
在项目中,在线程中获取信息,然后通过handler传递,在handler的handleMessage方法中处理信息并且用一个TextView把信息显示出来。
demo版本代码:
public class DemoActivity extends Activity implements OnClickListener{
private Button mButton;
private TextView mTextView;
public static int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(this);
mTextView = (TextView)findViewById(R.id.textView);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
changeTextView();
break;
default:
break;
}
}
Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
mTextView.setText("i = " + i++ + ", j = " + msg.arg1);
return true;
}
});
private void changeTextView() {
new Thread(new Runnable() {
@Override
public void run() {
int j = 0;
try {
while (j < 5) {
j++;
Message msg = Message.obtain();
msg.arg1 = j;
mHandler.sendMessage(msg);
Thread.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
情况近似于上面demo代码,但是上面代码中没有出现下面将要说到得问题。在我的项目代码中,第一次装上应用,完全没有问题,handler传递消息,handlerMessage方法处理消息,然后可以在TextView中显示出来。但是,当按返回键退出程序后,再一次进入,通过handler传递消息,在handlerMessage方法中处理消息,在log显示,可以获取消息,但是TextView却不能显示。使用以下代码打印Log:
if (mResultText.isShown()) {
Log.v("@@@@@@", "mResult is shown in @@@@@");
} else {
Log.v("@@@@@@", "mResult is not shown in @@@@@");
}
执行
Log.v("@@@@@@", "mResult is not shown in @@@@@");
也就是说,当再次进入程序后,mResultText(一个textview) isShown方法返回false,不可见。
设置为可见:
mResultText.setVisibility(View.VISIBLE);
也不起作用。
解决方法:
把mResultText设为静态:
private static TextView mResultText;
问题解决,但是其中原理还不明白。如果有清楚原因者,望相告,谢谢(注:Activity的launchMode="singleInstance")。同时,这个问题应该很少会有人遇到。