我正在尝试使用Fragment的onResume()
方法操作TextView。我已经定义了一个处理程序,并在调用处理程序run()
后尝试从post()
内更改文本。虽然这确实改变了TextView的文本,但我尝试在Handler之外操作相同的TextView,但TextView的文本不会改变。在这种情况下发生了什么,以及为什么TextView没有更改为" BAR"。我执行的所有代码都在下面:
@Override
public void onResume(){
super.onResume();
mHandler = new Handler();
Looper looper = mHandler.getLooper();
Thread thread = looper.getThread();
Log.v("THREAD",thread.getName());
// prints main in logcat
mHandler.post(new Runnable(){
@Override
public void run() {
try {
// TextView's text changes to "FOO"
mTextView.setText("FOO");
}
catch(Exception exception){
exception.toString();
}
}
});
// Logcat prints this message
Log.v("AFTER HANDLER","AFTER HANDLER");
// TextView's text does not change to "BAR"
mTextView.setText("BAR");
}
如果我错过了一些基本的东西,请道歉,但对此的任何澄清都会非常有帮助。谢谢!
答案 0 :(得分:2)
onResume()
适用于您希望从UI线程外部执行UI操作的情况。当它添加您传递给该方法的runnable,并对其进行排队,以便在下一次UI传递时,您的runnable将会运行。
TextView's
,因此不需要在UI线程上排队此操作。它的工作方式不会改变 - 在下一个UI传递(不是当前传递,下一个)时,TextView
文本将更改为“FOO”。
在onResume方法的UI线程的当前传递中,您还将文本设置为“BAR”。一瞬间,dataSize = size(datain,2);
upsamp = [datain.' zeros(dataSize,1) zeros(dataSize,1)];
len = size(upsamp,1) * size(upsamp,2);
upsamp = reshape(upsamp.',1,len);
确实会显示此文本。但是,在不久之后发生的下一个UI传递中,“BAR”文本被替换为“FOO”。
这就是您没有看到“FOO”文本的原因。您之后会立即安排另一个UI通道,并且在您发现文本不同之前会替换文本。
答案 1 :(得分:1)
Handler.post(Runnable r)
会将r
添加到邮件队列中。它不会立即运行。在你的情况下" BAR"首先设置,之后" FOO"已经确定了。
更多详情here。
答案 2 :(得分:0)
mTextView.setText("BAR")
可能是第一个,mTextView.setText("FOO")
是第二个。
如果代码在下面会发生什么?
@Override
public void onResume(){
super.onResume();
mHandler = new Handler();
Looper looper = mHandler.getLooper();
Thread thread = looper.getThread();
Log.v("THREAD",thread.getName());
// prints main in logcat
mHandler.post(new Runnable(){
@Override
public void run() {
try {
Log.v("Which is earlier?", "FOO");
mTextView.setText("FOO");
}
catch(Exception exception){
exception.toString();
}
}
});
Log.v("Which is earlier?", "BAR");
mTextView.setText("BAR");
}