web-dev-qa-db-ja.com

アンドロイドでコードを数秒間停止させるにはどうすればよいですか?

基本的に、ユーザーが次のアクションが実行される前に何が起こるかを見ることができるように、1つのアクションに入れるために一時停止(ほんの数秒に基づく)が必要です。ブラックジャックの場合、ディーラーの番で、彼がヒットすることに決めたとき、彼はヒットし、カードが追加され、次に彼は次に何をするかを決定します。彼が次に何をすべきかを決める前に、ディーラーが何をしているかを「見る」ことができるようにコードを一時停止して、ディーラーが1秒以内に自分の行動を完了せず、プ​​レーヤーにしか見えないようにします結果。

前もって感謝します!

Wait(ここに番号を挿入)を使用しようとしたことに注意してください。しかし、私はEclipseからスタックインターセプトエラーまたはソートのようなものを引き起こし、例外をスローするため、何もしないと言われます:(

まあ、これは興味深いです(私が物事をプログラムした方法は、控えめに言っても「興味深い」です)Thread.sleep(5000)を実行し、try catchでスローし、5秒間スリープしてから実行を続けますコード。ただし、ビューの更新は、ボタンを押すまで表示されません(イベント駆動型プログラミングが本当に嫌いです)。

38
Ivan S

ここでは、イベントの観点から考えることを学ぶことが重要です。できます。 :)

最初のルールは、UIスレッドを停止させないことです。 UIスレッドは、アプリの応答性を維持する責任があります。そこで行う作業はブロックされません。必要なことを行い、できるだけ早く戻ってください。 UIスレッドでI/Oを実行することは絶対に避けてください。 (ライフサイクルの要件により、実際に支援できない場所がいくつかあります。たとえば、アプリの状態をonPauseに保存します。)ever呼び出しThread.sleepあなたが間違っているUIスレッドで。

Androidは、ユーザーに表示される「アプリケーションが応答していません」(または「ANR」)エラーでこれを強制します。 Androidアプリでこれを見るときはいつでも、開発者がUIスレッドを長時間停止させる原因となった何かをしたことを意味します。アプリ開発者の責任ですが、通常はアプリが何か間違ったことをしていることを意味します。

独自のイベントを投稿することにより、このモデルを活用できます。これにより、アプリに「後でこれを行う」ことを簡単に伝えることができます。 In Android独自のイベントを投稿するための鍵は Handler クラスにあります。メソッド postDelayed =一定のミリ秒後に実行される Runnable をスケジュールできます。

次のようなアクティビティがある場合:

public class MyActivity extends Activity {
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler.postDelayed(new Runnable() {
            public void run() {
                doStuff();
            }
        }, 5000);
    }

    private void doStuff() {
        Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
    }
}

アクティビティが作成されてから5秒後に、doStuffにトーストが作成されます。

カスタムViewを作成している場合は、さらに簡単です。ビューには独自の postDelayed メソッドがあり、すべてが正しいHandlerにポストされるため、独自のメソッドを作成する必要はありません。

2番目のルールは次のとおりです。ビューはonlyUIスレッドで変更する必要があります。これらの例外を取得して無視すると、何か問題が発生したことを意味します。それらを無視すると、アプリが面白い動作をする可能性があります。アプリが他のスレッドでほとんどの作業を行う場合、 post イベントを直接変更して、変更が正しく実行されるようにすることができます。

コードのその部分からActivityへの参照がある場合は、 Activity#runOnUIThread を使用することもできます。これは、名前が示すとおりのものです。コンテキストで単一のビューへの投稿が実際に意味をなさない場合、このアプローチを好むかもしれません。

ボタンを押すまで表示されないビューの更新について、どのようなビューがありますか?これらの更新を描画しているカスタムビューですか?その場合、データの変更後に invalidate を呼び出して再描画をトリガーすることを覚えていますか?ビューは、無効化された後にのみ再描画されます。

96
adamp