0

我开始研究线程,我不明白为什么下面的简单代码不起作用。它正在抛出:

RuntimeException: can't create handler inside thread that has not called looper.prepare():

这是代码

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.id1:
        Thread th =new Thread(new Runnable() {
               public void run() {
                update();
                delObjects();
                addObjects();

               }
              }); 
        th.start();
        break;
        }
    }

我读到有时当您尝试修改 UI 时会发生错误,但这不是我的情况。

提前致谢!

4

2 回答 2

1

如果你没有访问 UI 的东西,那么你很可能在做深度线程。基本上,您不能从已经线程化的 run() 方法之外启动线程。所以你的方法,

update();
delObjects();
addObjects();

可能正在使用线程,这会导致此问题。在大多数情况下,您不需要这样的线程,因为您已经在 UI 线程之外,因此您可以跳过这些函数内部的线程。在某些情况下,如果必须在没有运行包装线程的其他地方使用这些函数,则可能需要在方法本身中有线程。因此,如果是这种情况,请将您的代码更改如下。

public void onClick(View v) {

    switch (v.getId()) {
        case R.id.id1:
        Thread th = new Thread(new Runnable() {
            public void run() {
                //Prepare for further threading.
                Looper.prepare();

                update();
                delObjects();
                addObjects();
            }
        }); 
        th.start();
        break;
    }
}

希望有帮助。

于 2012-10-07T02:48:59.290 回答
0

创建线程时,使用 var name “th”,但启动线程时,使用“th1”。当您提出问题时,这是一个错字,还是您的代码中的错误?

于 2012-10-07T02:38:32.630 回答