5

これも繰り返しの質問ですが、私の場合は別の質問です。

静的関数とハンドラーを持つクラスabcがあります。以前は、静的関数からハンドラーを呼び出すことができませんでした。次に、静的関数から非静的関数にアクセスするためにグーグルで検索し、解決策はクラスのインスタンスを作成して非静的変数にアクセスすることであることがわかりました。しかし今、なぜ、私はこのエラーを取得しています。

E/AndroidRuntime(13343): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

public class abc
 {    
    static public void Instantiate()
    {
         abc xyz = new abc();
         xyz.handler.sendEmptyMessage(1);      **//GETTING ERROR IN THIS LINE**
    }

    public Handler handler = new Handler() 
        {
                public void handleMessage(Message msg) 
                {
                        switch (msg.what)
                        {
                        }
                 }
        }

}

私の質問:静的関数からハンドラーにメッセージを送信するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

7

あなたがこれをしている場所をチェックしてください:

abc.Instantiate();

と置き換えます

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        abc.Instantiate();
    }
});

アクティビティから呼んでいただければ幸いです

いくつかの説明( bicska88を引用 ):)


Handler問題の原因は、静的関数内からオブジェクトにメッセージを送信するという事実とは何の関係もありません。問題は、呼び出されていないスレッドからハンドラーにメッセージを送信することですLooper.prepare()(エラーメッセージに示されているように、スレッドには)がありませんmessage loop。これはLooper.prepare()、before-whileを明示的に呼び出すか、UIThreadでコードを実行することで修正できます。


于 2012-07-17T08:33:52.577 に答える
2

ハンドラーを次のように定義してみてください

final static Handler handler = new Handler() { ... };
于 2012-07-17T08:33:25.617 に答える
2

Handler問題の原因は、静的関数内からオブジェクトにメッセージを送信するという事実とは何の関係もありません。問題は、呼び出されていないスレッドからハンドラーにメッセージを送信することですLooper.prepare()(エラーメッセージに示されているように、スレッドには)がありませんmessage loop。これを修正するには、次の手順を実行します。

public class abc
{    
    public Handler handler;

    static public void Instantiate()
    {
        abc xyz = new abc();
        Looper.prepare();
        handler = new Handler() 
        {
            public void handleMessage(Message msg) 
            {
                switch (msg.what)
                {

                }
            }
        }
        xyz.handler.sendEmptyMessage(1);
        Looper.loop();
    }
}

ドキュメントはこのリンクにあります。

于 2012-07-17T09:42:06.683 に答える