-1

重複の可能性:
Android: スレッドで乾杯

標準の方法を使用して、スレッド内にトーストを表示しようとしています:

Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show();

通常の方法では、これはもちろん機能しています。しかし、別のスレッドから呼び出そうとすると、例外があります。

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

私にはそれが何を意味するのかまったくわかりません。

私が渡すコンテキスト値は、アプリケーション自体 (アプリケーションはコンテキストから継承されます) またはApplication.getApplicationContext().

ちなみに、なぜこの冗長なものがあるのか​​ 、まったくわかりません。アプリケーション (それ自体はすでにコンテキストです) およびApplication.getApplicationContext().

4

2 に答える 2

8

トーストの表示など、ワーカー スレッドから UI に影響を与えることはできません。Activity.runOnUiThread()メインスレッドでその行を実行するために使用します。このような:

MyActivity.runOnUiThread(new Runnable()
{
    public void run()
    {
        Toast.makeText(context, "Hello World!", Toast.LENGTH.SHORT).show();
    }
});

またはHandler、メイン スレッドとそのpost()メソッドで作成されたオブジェクトを使用します。非常によく似た構文。

于 2013-01-23T22:37:07.837 に答える
0

バックグラウンド スレッドから UI を直接操作することはできません。解決策の 1 つは、Handlerオブジェクトを使用してスレッド間で通信し、Toast を表示させることです。このようなもの:

Handler h = new Handler() {
  public void handleMessage(Message msg){
    if(msg.what == 0){
      Toast.makeText(context, "HelloWorld!", Toast.LENGTH_SHORT).show();
    }
  }
};

次に、バックグラウンドスレッド内でこれを使用できます:

h.sendEmptyMessage(0);

トーストを表示する準備ができているという信号を送信します。

于 2013-01-23T23:49:23.760 に答える