2012-03-23 13 views
0

スレッドのエラーのトースト通知を送信しようとしています。スレッドは、メインスレッドから呼び出されるサービスで開始されます。私はView.postといくつかの奇妙なハンドラーのものでいくつかのことを試しましたが、何も動作していないようです。スレッドの抜粋は次のとおりです。サービス内のスレッドからトーストを送信

public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    new Thread(new Runnable(){ 
     public void run() { 
      boolean bol = true; 

      while (bol) 
      { 

       try 
       { 
        //Some socket code... 
       } 
       catch (Exception e) 
       { 
       //Where I want the toast code. 
       } 
      } 

     } 
    }).start(); 

    return START_STICKY; 
} 

答えて

2

トーストはUIスレッド(メインスレッド)からのみ表示できます。いくつかのスレッドからToastを表示するには、Handlerを使用する必要があります。

Threads, Handlers and AsyncTask

+0

リンクありがとうございます。私はサービスの中で主な活動ではないので、それは違うの? – Matt

+0

いいえ。サービスやアクティビティからトーストを表示できます。 –

+0

静的な問題はありませんか?ハンドラをインスタンスオブジェクトとして定義すると、スレッドは静的なのでスレッドから呼び出すことはできません。 – Matt

0

はいあなたはHandlerを使用する必要があり、かつHandlerが設定されると、ここで

Message msg = Message.obtain(null, MyActivity.TOAST); 
    Bundle bundle = new Bundle(); 
    bundle.putString(MyActivity.TOAST_MSG, "Toast message"); 
    msg.setData(bundle); 
    try { 
     myActivityMessenger.send(msg); 
    } catch (RemoteException e) { 
     if (D) Log.w(TAG, "Unable to send() the toast message back to the UI."); 
     e.printStackTrace(); 
    } 

myActivityMessenger、あなたは何をすべきかは、あなたのService

にあなたActivityをバインド設定されていますMyActivityHandlerで送信し、をバインドするとServiceに送信されますへ。

コンテキストでをServiceと表示しても問題ありません(ただし、これは最良の方法ではありません)。新しいスレッドから作成しようとしている可能性があります。 Toastを作成するためのコードは何ですか?

0
new Thread(){ 
     @Override 
     public void run() { 

      runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         _dialog.dismiss(); 
         Toast.makeText(LatestNewsActivity.this, "NO Internet Connection Available", Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
    }.start(); 
+0

これがActivityのようなものの内部クラスでない場合あなたはcontext.runOnUiThreadの権利を提供する必要がありますか? –

+0

はい本当にコンテキストが必要です。 –

4

サービスにおけるスレッド内で、次の試してみてください。

Android: How can i show a toast from a thread running in a remote service?に@Alex Gitelman hereによって与えられた答えから撮影
Handler h = new Handler(context.getMainLooper()); 
    // Although you need to pass an appropriate context 
    h.post(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(context,message,Toast.LENGTH_LONG).show(); 
     } 
    }); 

。これは誰かが私を助けたように助けるかもしれません。

+0

アンドロイドスタジオ2.2.2で「ハンドラが抽象的でインスタンス化できません」というエラーが表示されます。編集:それは私が間違ったハンドラを使用したのでthats。 android.os.Handlerを使用してください。 – Harmen

+0

それは正しい答えです!他のすべての人がrunOnUiThreadについて言っています – ospider

関連する問題