我有一个例程,用于设置文本视图。它对名称进行一些名义处理,填充空白等。此外,它使用View.Post在UI线程上运行。这是所述功能的相关部分:
public void setValue(final String value)
{
Log.v(TAG,"Name="+ mFieldName.getText()+" value="+value);
//Log.v(TAG,unknown);
mValue.post(new Runnable(){
@Override
public void run() {
Log.v(TAG,"Start: Name="+ mFieldName.getText()+" value="+value);
if (value==null)
mValue.setText(R.string.loading);
else
mValue.setText(value);
Log.v(TAG,"Posted: Name="+ mFieldName.getText()+" value="+mValue.getText());
}
});
mValue和mFieldName是在其他地方指定的TextView。注意3 Log语句。这里有3个名称准确度:
10-27 22:27:49.491: V/OOP(19865): Name=Accuracy value=25.0 m
10-27 22:27:50.171: V/OOP(19865): Start: Name=Accuracy value=null
10-27 22:27:50.171: V/OOP(19865): Posted: Name=Accuracy value=Finding...
我很难理解在创建runnable的过程中值是如何变化的。有什么想法吗?
答案 0 :(得分:0)
似乎发生的事情是setValue
被多次调用而未完成。我通过检查并添加boolean viewChangePending
类来阻止它。我可能已经用锁定线程轻松完成了这项工作,但这似乎可以解决问题,所以......
public void setValue(final String value)
{
final String fieldName= new String((String) mFieldName.getText());
Log.v(TAG,"Name="+ fieldName+" value="+value);
//Log.v(TAG,unknown);
try {
while(viewChangePending)
Thread.sleep(1);
} catch (InterruptedException e) {
}
viewChangePending=true;
mValue.post(new Runnable(){
@Override
public void run() {
Log.v(TAG,"Start: Name="+ fieldName+" value="+value);
if (value==null)
mValue.setText(R.string.loading);
else
mValue.setText(value);
Log.v(TAG,"Posted: Name="+ fieldName+" value="+mValue.getText());
viewChangePending=false;
答案 1 :(得分:-1)
如果您希望向UI显示价值或任何影响,您应该运行RunOnUiThread。
以下是示例:
runOnUiThread(new Runnable() {
@Override
public void run() {
//YOUR CODE HERE
}
});