1/10 秒間スリープしてから再ループするバックグラウンド スレッドがあります。画面を無効にしたいので、再描画して簡単なアニメーションを行います。画面を無効にできる唯一の方法は、多くのオーバーヘッドがあると想定される Runnable で行う場合のようです。
ランナブルを使用せずにスレッド内の画面を無効にする方法はありますか??
1/10 秒間スリープしてから再ループするバックグラウンド スレッドがあります。画面を無効にしたいので、再描画して簡単なアニメーションを行います。画面を無効にできる唯一の方法は、多くのオーバーヘッドがあると想定される Runnable で行う場合のようです。
ランナブルを使用せずにスレッド内の画面を無効にする方法はありますか??
Android SDK には、この目的のためのビルトイン API があります - View.postInvalidate() :
public void postInvalidate ()
イベント ループの後続のサイクルで無効化を発生させます。これを使用して、非 UI スレッドからビューを無効にします。
このメソッドは、このビューがウィンドウにアタッチされている場合にのみ、UI スレッドの外部から呼び出すことができます。
関連項目
invalidate() postInvalidateDelayed(long)
バックグラウンド スレッドから UI 関連の API を呼び出すことは合法ではありません。したがって、を使用する必要がありますRunnable
。
CountDownTimer
バックグラウンド スレッドがスリープだけを行う場合は、代わりにクラスを使用することで、おそらくスレッドを使用せずに同じ効果を得ることができます。または、API を使用して、将来の特定のミリ秒数で UI スレッドで を実行するようHandler.postAtTime()
にスケジュールすることもできます (これも別のスレッドを使用せずに)。Runnable
スレッドのハンドラーにメッセージを送信し、handleMessage で無効化してみてください。うまくいくかもしれません。または、Salil Pandit が言ったように AsyncTask を使用します。Async の方が優れていると思います。
実際、オーバーヘッドはごくわずかだと思います。AsyncTask
ただし、次のように使用できます。
new AsyncTask<Void, Void, Void>() {
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Void doInBackground(Void... params) {
while(true) { //probably want some other challenge here
Thread.sleep(1000 / 10);
publishProgress();
}
return null;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onProgressUpdate(Progress[])
*/
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
mMyView.invalidate();
}
}.execute();
onProgressUpdate は UIThread で自動的に実行されるため、毎回新しい実行可能ファイルを作成する必要がないため、これは良いことです...