线程错误

时间:2018-05-02 14:42:58

标签: android multithreading android-thread

我收到一些错误。我今天真的无法解决它:(我在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");
}

1 个答案:

答案 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元素。