从一些示例线程代码中获取RuntimeException

时间:2012-10-07 02:34:41

标签: java android multithreading

我开始研究线程,我不明白为什么以下简单代码不起作用。扔掉了:

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时有时会发生错误,但这不是我的情况。

提前致谢!

2 个答案:

答案 0 :(得分: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;
    }
}

希望有所帮助。

答案 1 :(得分:0)

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