我有一个调用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组件上的后台线程创建的实时数据。
答案 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。主线程)