1

1/10 秒間スリープしてから再ループするバックグラウンド スレッドがあります。画面を無効にしたいので、再描画して簡単なアニメーションを行います。画面を無効にできる唯一の方法は、多くのオーバーヘッドがあると想定される Runnable で行う場合のようです。

ランナブルを使用せずにスレッド内の画面を無効にする方法はありますか??

4

4 に答える 4

4

Android SDK には、この目的のためのビルトイン API があります - View.postInvalidate() :

public void postInvalidate ()

イベント ループの後続のサイクルで無効化を発生させます。これを使用して、非 UI スレッドからビューを無効にします。

このメソッドは、このビューがウィンドウにアタッチされている場合にのみ、UI スレッドの外部から呼び出すことができます。

関連項目

 invalidate()  
 postInvalidateDelayed(long)
于 2012-07-19T02:57:49.837 に答える
0

バックグラウンド スレッドから UI 関連の API を呼び出すことは合法ではありません。したがって、を使用する必要がありますRunnable

CountDownTimerバックグラウンド スレッドがスリープだけを行う場合は、代わりにクラスを使用することで、おそらくスレッドを使用せずに同じ効果を得ることができます。または、API を使用して、将来の特定のミリ秒数で UI スレッドで を実行するようHandler.postAtTime()にスケジュールすることもできます (これも別のスレッドを使用せずに)。Runnable

于 2012-07-18T23:34:53.630 に答える
0

スレッドのハンドラーにメッセージを送信し、handleMessage で無効化してみてください。うまくいくかもしれません。または、Salil Pandit が言ったように AsyncTask を使用します。Async の方が優れていると思います。

于 2012-07-19T02:35:35.850 に答える
0

実際、オーバーヘッドはごくわずかだと思います。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 で自動的に実行されるため、毎回新しい実行可能ファイルを作成する必要がないため、これは良いことです...

于 2012-07-19T00:37:06.877 に答える