0

我有一个用来设置文本视图的例程。它对名称进行一些名义上的处理、填充空白等。此外,它使用 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...

我很难理解在创建可运行文件的过程中值是如何发生变化的。有什么想法吗?

4

2 回答 2

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;
于 2013-10-28T10:17:20.127 回答
-1

如果你想显示对 UI 的价值或任何影响,你应该运行 RunOnUiThread。

这是示例:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         //YOUR CODE HERE
    }
});
于 2013-10-28T03:07:37.480 回答