錯誤嘗試
// 主線程睡眠會導致 ANR,UI 不更新
Thread.sleep(100);
layout.setBackgroundColor(Color.BLACK);
Thread.sleep(20);
正確方案:Handler.postDelayed
public class StrobeActivity extends Activity {
private LinearLayout layout;
private Handler handler = new Handler();
private boolean toggle = true;
private final Runnable strobeRunnable = new Runnable() {
@Override public void run() {
layout.setBackgroundColor(toggle ? Color.WHITE : Color.BLACK);
toggle = !toggle;
long delay = toggle ? 100 : 20; // 白100ms,黑20ms
handler.postDelayed(this, delay);
}
};
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_strobe);
layout = findViewById(R.id.strobe_layout);
handler.post(strobeRunnable); // 啟動
}
@Override protected void onDestroy() {
handler.removeCallbacks(strobeRunnable); // 停止防洩漏
super.onDestroy();
}
}
關鍵點
- 所有 UI 操作在主線程,
Handler 綁定主線程 Looper。
postDelayed 實現非阻塞定時循環。
onDestroy 移除回調防止內存洩漏和崩潰。
- 全屏主題
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 效果更佳。