为什么我的值没有保留在Runnable中?

时间:2013-10-28 02:33:19

标签: android android-view runnable

我有一个例程,用于设置文本视图。它对名称进行一些名义处理,填充空白等。此外,它使用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的过程中值是如何变化的。有什么想法吗?

2 个答案:

答案 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
    }
});