后台线程在设置EditText的值时失败

时间:2014-05-10 21:33:30

标签: java android multithreading

我有一个调用MainActivies方法的线程,该方法设置EditText的文本值,但它失败了。

MyRunnable就是这样:

public class MyRunnable implements Runnable {

    MainActivity mController;

    public SoundTrigger(MainActivity pController) {
        mController = pController;
    }

    @Override
    public void run() {     
        for (int i = 0; i < 10000; i++) {

            if(i % 100) {
                mController.triggered(i);
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在MainActivity类中,我的触发方法如下:

public void triggered(int nNum) {

    EditTextInstance.setText(nNum+"");

}

但它失败了。我只需要打印由edittext组件上的后台线程创建的实时数据。

1 个答案:

答案 0 :(得分:2)

像这样:

 @Override
 public void run() {     

     for (int i = 0; i < 10000; i++) {
          if(i % 100) {
           mController.runOnUiThread(new Runnable() {
                 public void run() {
                    mController.triggered(i);
                 }
           });

    }

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
  }
}

说明:您之前从非UI线程更改了UI元素,但这并不好。此代码应该可以工作,但它仍然不是解决问题的推荐方法。你应该使用类似AsyncTask的东西,你有'背景'操作的模板方法(非ui线程操作)和已经在UI线程上执行的'onPostExecute'。 / p>

另一个补充说明:永远不要调用 Thread.sleep();在UI线程(a.k.a。主线程)