あなたはUIを更新できるように、後にUIスレッド上で、あなたのメソッドを呼び出すためにHandlerでpostDelayed
を使用することができます。
は、実際に、これはすでにAndroid上でどのように行われるかについては非常に素晴らしい記事があります:http://developer.android.com/resources/articles/timed-ui-updates.html
あなたは、またはビューにgetHandler()
を呼び出すことによって、UIスレッド上で実行されているコードに1を作成することにより、いずれかのハンドラを取得することができます(たとえば、あなたのボタン自体)。
私は例を挙げておきますが、リンクされている記事は既に非常に詳細で明快になっていますので、私はそれを延期します。
を編集します。これはどのように見えるかについての概要です。私は今Android SDKをインストールしていないので、これが動作することを確認することはできません。
public class CountdownButton extends Button {
private boolean isCounting = false;
private int count;
private final Runnable countdownRunnable = new Runnable() {
@Override
public void run() {
setText(Integer.toString(count));
if (count > 0) {
count--;
getHandler().postDelayed(countdownRunnable, 1000);
} else {
// count reached zero
isCounting = false;
setText("boom");
}
}
}
private final View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isCounting) {
// stop counting
isCounting = false;
getHandler().removeCallbacks(countdownRunnable);
setText("cancelled");
} else {
// start counting
isCounting = true;
count = 10;
countdownRunnable.run();
}
}
}
public CountdownButton(Context context) {
super(context);
setOnClickListener(onClickListener);
}
public CountdownButton(Context context, AttributeSet attrs) {
super(context, attrs);
setOnClickListener(onClickListener);
}
public CountdownButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnClickListener(onClickListener);
}
}
タイミングは、(起こっている他のCPUの多くの作業があります場合は特に)完璧ではないかもしれないが、それはあなたの目的のために十分に良いことがあります。
asynctaskを使用してボタンのテキストを更新します。 –