有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个线程调用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) 个答案

  1. # 1 楼答案

    这样做:

     @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线程更改为非UI线程,这不好。这段代码应该可以工作,但它仍然不是解决问题的推荐方法。您应该使用类似AsyncTask的方法,其中有一个用于“后台”操作(非ui线程操作)的模板方法,以及已经在ui线程上执行的“onPostExecute”

    另外一个注意事项:永远不要调用线程。睡眠();在UI线程上(又称主线程)