2011-10-18 13 views
3

show();私のトーストを試してみると面白い問題があります。 2つのトーストがtry/catch and Thread.sleep();で区切られています。この場合、2番目のトースト、toast2が表示されますが、toast1は表示されません。トーストはtry/catchの前に表示されませんThread.sleep()

try/catchを取り除くと、両方のトーストが問題なく表示されます。

toast.show();がUIスレッドで他の操作と競合する要求を行ったことがあります。私はそれが私がここにあるのと同じ問題であるかどうか疑問に思っていますThread.sleep();どうすればこの問題を解決できますか?

は、あなたが右の最初の乾杯の後、UIスレッドを一時停止するので、それは を示すことにする機会を持っていない

TestService.java

///Debug - Show a Toast 
    // Toast does NOT show up 
    Toast toast1 = Toast.makeText(context,"Service Started", Toast.LENGTH_SHORT); 
    toast1.show(); 

    //Try to sleep for roughly 2 seconds 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //Debug - Shows a Toast 
    Toast toast2 = Toast.makeText(context,"Sleep completed", Toast.LENGTH_SHORT); 
    toast2.show(); 
+0

これはUIスレッドで実行されていますか? – spatulamania

+0

あなたは何をしなければならないのですか?あなたはUIスレッドが2秒間待つかどうか、またはあなたのコントロールフローが2秒間待たされるようにします。 – Harinder

+0

初めてUIの基本を学ぶ – ingsaurabh

答えて

8

実際には、「スリープ」の代わりにロジックがあるでしょうか? あなたの例によれば、サービスを開始するための正しいアンドロイドの方法は、ワーカースレッド上で実行することです。これはあなたがANRを取得しないことを確認します。あなたのようなものになります可能性があり

:私は同じ問題に直面して

new AsyncTask<Void, Void, Void>() { 

     @Override 
     protected void onPostExecute(Void result) { 
      Toast toast2 = Toast.makeText(context, "Sleep completed", 
        Toast.LENGTH_SHORT); 
      toast2.show(); 
     } 

     @Override 
     protected void onPreExecute() { 
      Toast toast1 = Toast.makeText(context, "Service Started", 
        Toast.LENGTH_SHORT); 
      toast1.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // Try to sleep for roughly 2 seconds 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 

     } 

    }.execute(); 
1

ありがとうございます。そして、睡眠が終わるまでに、最初に トーストの時間が過ぎました。

これはもっともらしい説明のようですが、私は間違っているかもしれません。確かに見つけるために、Androidの コードで本当に深く掘る必要があります。

+0

私はあなたが正しいと思うアレックス:) – Marco

+0

私はあなたが正しいと信じています。私は時間をほとんど無くし、「トースト1」が現れた。 – evt

0

2秒以上続くトーストを作成する必要があるとします(別のトーストを送信する前にThread.Sleep(2000)を使用するのはなぜですか?)。
私はちょうど非常に良い例を提供するthis linkを見つけました。
希望があれば

0

を、示唆したように私はAsyncTaskを使って解決しようとしますが、私のユースケースは以下の通りです:

1)私はトーストメッセージを表示したい(ブロードキャストメッセージを開始する) 2)条件が正しい場合、私はクライアントにメッセージ1をブロードキャストする。 3)放送が完了するまで2秒間寝ます。 4)私は常にメッセージ2をクライアントにブロードキャストします。 5)それは私が別のメッセージ(完了のメッセージを放送)

を乾杯でしょう行うのならば、私は(シーケンスもののトーストメッセージはまだ逆に示された)次の回避策の例を作ってみた:

package com.toasttester; 

import android.os.Handler; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 
import android.os.AsyncTask; 

public class MainActivity extends ActionBarActivity { 
    Handler handler = new Handler(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     PreSleepToast pst = new PreSleepToast(); 
     pst.execute(); 
     Toast t = Toast.makeText(getApplicationContext(), "Message1", Toast.LENGTH_SHORT); 
     t.show(); 
     try { 
      Thread.sleep(2000);//to allow broadcasting to complete 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     callToast1(); 
    } 
    private Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      Toast t = Toast.makeText(getApplicationContext(), "Message3", Toast.LENGTH_SHORT); 
      t.show(); 
     } 
    }; 

    public class PreSleepToast extends AsyncTask<Void, byte[], Void> { 
     /** 
     * The sender socket on which we send connections. 
     */ 
     public PreSleepToast() { 
     } 

     /** 
     * Polling loop for outgoing connections. 
     */ 
     @Override 
     protected Void doInBackground(Void... params) { 
      handler.post(r); 
      return null; 
     }; 
    }; 

    public void callToast1(){ 
     Toast t = Toast.makeText(getApplicationContext(), "Message2", Toast.LENGTH_SHORT); 
     t.show(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

ええ、私の解決策は、マシュマロでのみ働いていました。ノーガットではうまくいきませんでした。ノーガットでは、 "メッセージ2"と置き換えられました。 – user2790273

+0

今、私はノーガットの行動に困惑しています.....私はArrayListを使って、睡眠の前にMessage1とMessage2を待ち行列に入れていても.....その後、ArrayListのメッセージをループしてToastするrunnableをポストするasynctaskを起動します。 ...まだ最後のメッセージだけが表示されています...... – user2790273

関連する問題