我收到一些错误。我今天真的无法解决它:(我在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");
}
答案 0 :(得分:1)
问题是您正在尝试更新另一个线程中的UI,但UI只能在UI线程中更新。如果您只是在代码显示时更新了UI,那么您应该从辅助线程中删除FillData中的调用,如果您在 new Thread() {
public void run() {
FillData();
pd.cancel();
}
}.start();
内部进行大量加载,则使用辅助线程,否则您&# 39;最好直接在UI线程中更新UI:
所以不要这样做:
getActivity().runOnUiThread(new Runnable() {
public void run() {
FillData();
}
});
只需调用FillData();在新线程之外。
您也可以调用runOnUiThread将更新带到ui线程:
runOnUiThread
如果您在FillData中的代码与繁重的加载代码混合在一起,那么您可以将FillData
方法放在runOnUiThread
内,并仅将UI更新代码移至viewElement.post(new Runnable() {
public void run() {
//update UI
}
});
}
。
如果你仍然希望保持你的代码,你可以"发布"来自您的辅助线程的更改如下:
viewElement
View
是从HemisphereLight
扩展的任何UI元素。