1

我得到一些错误。我今天真的无法解决:(在 FillData() 方法中将 ID 数据设置为 lblID 后出现错误。它正确设置了 ID 数据,但 lblTitle 和 lblPrice 总是返回错误,例如“只有创建视图层次结构的原始线程才能触摸它的意见”和程序停止运行。

注意:这不是我的原始代码。我只是将其最小化以便更易于理解,当然它会给出与下面的代码相同的错误。无论如何,在 FillData() 方法中,我从 wcf 服务获取数据并正确返回数据。我试过runonuithread,但没有任何意义。此外,如果我在线程之外编写代码,它不会填充控件。因为它最初是从 wcf 服务获取数据的。

public class MainActivity extends AppCompatActivity {
LinearLayout lytData;
TextView lblTitle, lblID, lblPrice;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    lytData = (TextView)findViewById(R.id.lytNewData);
    lblID = (TextView)findViewById(R.id.lblID);
    lblTitle = (TextView)findViewById(R.id.lblTitle); 
    lblPrice = (TextView)findViewById(R.id.lblPrice); 
    new Thread() {
        public void run() {
            FillData();
        }
    }.start();

    lytData.setOnTouchListener(new OnCustomTouchListener (context) {
        @Override
        public void ToLeft() {
            new Thread() {
                public void run() {
                    FillData();
                }
            }.start();
        }

        @Override
        public void ToRight() {
            new Thread() {
                public void run() {
                    FillData();
                }
            }.start();
        }
    });
}

void FillData() {
   lblID.setText("aaa");
   lblTitle.setText("aaa");
   lblPrice.setText("aaa");
}
4

1 回答 1

1

问题是您试图在另一个线程中更新 UI,但 UI 只能在 UI 线程中更新。如果您只是在代码显示时更新了 UI,那么您应该从辅助线程中删除来自 FillData 的调用,如果您在内部进行繁重的加载,请使用辅助线程,FillData()否则您最好直接在UI线程:所以不要这样做:

   new Thread() {
      public void run() {
         FillData();
         pd.cancel();
      }
    }.start();

只需简单地调用 FillData(); 在新线程之外。

您还可以调用 runOnUiThread 将更新带到 ui 线程:

getActivity().runOnUiThread(new Runnable() {
    public void run() {
        FillData();
    }
});

如果您在 FillData 中的代码与繁重的代码混合在一起,那么您可以将runOnUiThread方法带到内部,FillData并且仅将 UI 更新代码移动到runOnUiThread.

如果您仍想保持代码原样,您可以从辅助线程“发布”更改,如下所示:

viewElement.post(new Runnable() {
        public void run() {
            //update UI
        }
    });
}

viewElement是从 扩展的任何 UI 元素View

于 2018-05-02T14:45:43.937 回答