大家好,我现在在Android2.3下开发应用程序出现了这么一个问题。在一个Activity中有一个TextView控件,这个控件我在当前activity的xml里给其赋予了值,比如说是“当前组为XXXXX”
于是最开始的时候这个activity中文本框显示的是当前组为XXXXX。好啦,我在别的java文件中发送消息给这个activity想着更新这个文本框,于是activity接到消息后,
case MyApp.WM_CURRENTGROUP:
TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1);
CharSequence text = "当前组为"+CCallControl.gID;
Log.i(TAG, "当前组是"+CCallControl.gID);
textViewCurrentGroup.setText(text);
textViewCurrentGroup.invalidate();
break;
我log输出的结果为 当前组为1111,
可是我的UI界面上有时候确实是显示的为 当前组为1111
但是有的时候我的log输出了正确的信息,界面上依然显示的是 当前组为XXXXX
这是怎么回事呢,有知道的么?
谢谢您帮助我。我是在自己建立的一个线程里发送消息,然后主线程接收到消息后做出响应。我看到消息的发出是正常的,主线程也能借到这个消息,然后程序会执行到我提到的那个case程序段。 您提到的是不是在可操作ui的线程上操作的,我觉得是。因为我有时候是可以看到那个textview改变的,但是有的时候就是没改变。一旦我离开这个界面,然后再跳转到这个界面时,我就发现这个textview的内容改变了。
public class StandByActivity extends Activity {
...//初始化等等
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...//一些代码
setContentView(R.layout.standby);
//...一些处理代码
//开启主线程的消息队列
activityHandler = new Handler(){
@SuppressLint("HandlerLeak")
public void handleMessage(Message msg) {
Intent intent = new Intent();
switch(msg.what)
...//一些分支语句
case MyApp.WM_CURRENTGROUP:
TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1);
CharSequence text = "当前组为"+CCallControl.gID;
textViewCurrentGroup.setText(text);
textViewCurrentGroup.setTextColor(0xffff00ff);
Log.i(TAG, "当前组是"+CCallControl.gID);
textViewCurrentGroup.invalidate();
break;
...//剩余部分代码
invalidate();
我以为我的textview内容不变是有时候android UI未刷新的缘故。
invalidate();这个可以刷新控件。但是现在还是有时候控件内容显示变了,但是有时候不变。虽然显示的没有变,但是通过log信息可以看到输出,本质确实是变了,但是显示出来的还是原来的。
CCallControl.gID这个是一个静态的量,算是个全局的变量吧。我再发一下发送消息的代码。
我的程序不是测试代码,不好意思,不能发给你工程。
public void analyzeCTGS(String str){
StandByActivity.activityHandler.sendMessage( StandByActivity.activityHandler.obtainMessage(MyApp.WM_CURRENTGROUP) );
Log.i(TAG, "发送组"+CCallControl.gID+"设置消息");
这里也有log信息输出,显示着CCallControl.gID已经是我要的值了。
textViewCurrentGroup.setText(text);
问题在这里,你每次接收到消息之后就重新new了一下你的textView,这是不对的,你执行setText的textview和你界面上显示的textview已经不是同一个了.
TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1); 把这行代码移到Handler外面去.
我最终的解决方法:
1.public class StandByActivity extends Activity implements Runnable {
既让activity继承一个runnable
2.接到消息后
case MyApp.WM_CURRENTGROUP:
activityHandler.post(StandByActivity.this);
break;
其实就是调用本activity的
activityHandler.post,启动run函数。
3.run函数如下:
public void run() {
TextView textViewCurrentGroup = (TextView)findViewById(R.id.standby_textView1);
CharSequence text = "当前组为"+CCallControl.gID;
textViewCurrentGroup.setText(text);
textViewCurrentGroup.invalidate();
activityHandler.postDelayed(this, 1000);
}
这样一来,因为是屡次执行的,所以肯定是可以刷新了。
这个是我最终的代码,有细枝末节的和最开始发的不太一样了,但是框架相同。
再次感谢大家的热心帮助,谢谢。