これをやろうとした
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
t.setText("Step One: blast Egg");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText("Step Two: fry Egg");
しかし、何らかの理由で、実行すると2番目のテキストのみが表示されます。 Thread.sleep()
メソッドのブロックと関係があると思います。だから誰かが「非同期に」タイマーを実装する方法を教えてもらえますか?
ありがとう。
この回答をAndroid-discuss Googleグループに投稿しました
ビューにテキストを追加して「ステップ1:卵を爆破ステップ2:卵を揚げる」と表示する場合は、t.appendText("Step Two: fry Egg");
の代わりに_t.setText("Step Two: fry Egg");
を使用することを検討してください。
TextView
の内容を完全に変更して、起動時に「ステップ1:卵を吹き飛ばす」と表示し、後で「ステップ2:卵を揚げる」と表示したい場合は、いつでも使用できます。
Sadboyが実行した実行可能な例
がんばろう
onCreate()
メソッドにはいくつかの大きな欠陥があります。
1)onCreate
preparesアクティビティ-ここで行うことは何も行われませんvisibleこのメソッドが終了するまでユーザーに!たとえば、ここでTextView
のテキストをONE回以上変更することはできません。最後の変更のみが描画されるため、ユーザー!
2)Androidプログラムは-デフォルトでは-ONEスレッドでのみ実行されることに注意してください!したがって、UIを担当するメインスレッドでThread.sleep()
またはThread.wait()
を使用しないでください! (詳細については 「アプリの応答を維持する」 をお読みください!)
アクティビティの初期化は次のとおりです。
TextView
オブジェクトt
を作成します!TextView
でレイアウトのt
を選択します。t
のテキストを設定します(ただし、覚えておいてください:表示されるのはafteronCreate()
が終了し、アプリケーションのメインイベントループが実行されます!)onCreate
メソッド内で10秒待機します-この実行しないでくださいすべてのUIアクティビティを停止し、間違いなくANRを強制します(アプリケーションが応答しません。上記のリンクを参照してください!)onCreate()
メソッドが終了し、他のいくつかの Activity lifecycle メソッドが処理されるとすぐに表示されます!ソリューション:
onCreate()
にテキストを1回だけ設定します-これは表示される最初のテキストでなければなりません。
Runnable
とHandler
を作成します
private final Runnable mUpdateUITimerTask = new Runnable() {
public void run() {
// do whatever you want to change here, like:
t.setText("Second text to display!");
}
};
private final Handler mHandler = new Handler();
このrunnableをonCreate()
で可能なハンドラーとしてインストールします(ただし、以下のアドバイスをお読みください):
// run the mUpdateUITimerTask's run() method in 10 seconds from now
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
アドバイス:Activity
のライフサイクルを必ず確認してください! onCreate()
でそのようなことをすると、Activity
がfirstの時間に作成されたときにのみ発生します! Androidは、Activity
が表示されていなくても、より長い期間生き続ける可能性があります!ユーザーが再び「開始」するとき-そしてそれがまだ存在している-あなたの最初のテキストはもう表示されません!
=>常にハンドラをonResume()
にインストールし、onPause()
で無効にします!そうでない場合は、Activity
がまったく表示されないときに「更新」を取得します!あなたの場合、最初のテキストが再びアクティブになったときに再び表示したい場合は、onResume()
ではなくonCreate()
に設定する必要があります!
新しいテキストビューの最初の行は不要です
t=new TextView(this);
あなたはこれを行うことができます
TextView t = (TextView)findViewById(R.id.TextView01);
ここでスリープするバックグラウンドスレッドは一例ですが、これにはもっと良いタイマーがあると思います。代わりにタイマーを使用した良い例へのリンクがあります http://Android-developers.blogspot.com/2007/11/stitch-in-time.html
Thread thr = new Thread(mTask);
thr.start();
}
Runnable mTask = new Runnable() {
public void run() {
// just sleep for 30 seconds.
try {
Thread.sleep(3000);
runOnUiThread(done);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable done = new Runnable() {
public void run() {
// t.setText("done");
}
};
@ user264892
文字列変数を使用する場合、 ""の文字列をプレフィックスするか、明示的にCharSequenceにキャストする必要があることがわかりました。
代わりに:
String Status = "Asking Server...";
txtStatus.setText(Status);
試してください:
String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);
または:
String Status = "Asking Server...";
txtStatus.setText("" + Status);
または、あなたの文字列は動的ではないので、さらに良い:
txtStatus.setText("AskingServer...");
あなたのアドバイスに従って、私はハンドルとランナブルを使用して、「タイマー」を使用してTextViewのコンテンツを切り替え/変更しています。何らかの理由で、実行中、アプリは常に2番目のステップ(「ステップ2:卵を揚げる」)をスキップし、最後(3番目)のステップのみを表示します(「ステップ3:卵を提供する」)。
TextView t;
private String sText;
private Handler mHandler = new Handler();
private Runnable mWaitRunnable = new Runnable() {
public void run() {
t.setText(sText);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMonster = BitmapFactory.decodeResource(getResources(),
R.drawable.monster1);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
sText = "Step One: unpack Egg";
t.setText(sText);
sText = "Step Two: fry Egg";
mHandler.postDelayed(mWaitRunnable, 3000);
sText = "Step three: serve Egg";
mHandler.postDelayed(mWaitRunnable, 4000);
...
}
@Zordid @Iambdaの答えは素晴らしいですが、
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
run()メソッドで
mHandler.postDelayed(mUpdateUITimerTask, 0);
onCreateメソッドで、更新を続けます。
テキストをsam textviewに2回設定すると、最初に書かれたテキストが上書きされます。したがって、settextを使用する2回目は、次のように新しい文字列を追加するだけです。
textview.append("Step Two: fry Egg");
:)間違った方法でスレッドを使用しています。以下を実行してください。
private void runthread()
{
splashTread = new Thread() {
@Override
public void run() {
try {
synchronized(this){
//wait 5 sec
wait(_splashTime);
}
} catch(InterruptedException e) {}
finally {
//call the handler to set the text
}
}
};
splashTread.start();
}
それでおしまい。