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

スレッドを作成するときは変数名「th」を使用しますが、スレッドを開始するときは「th1」を使用します。これは、質問するときのタイプミスですか、それともコードのエラーですか?

于 2012-10-07T02:38:32.630 に答える