App 啟動時直接彈出「取消關注中...」對話框,且主界面按鈕邏輯混亂,無法正常退出。
在 onCreate() 中直接調用了 ProgressDialog.show(... "取消關注中..."),且發送了延遲消息 mHandler.sendEmptyMessageDelayed(0, 3000),導致未點擊按鈕就觸發了取消邏輯。同時 flag 初始為 0,按鈕點擊邏輯與初始化邏輯衝突。
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
dialog = ProgressDialog.show(this, "", "取消關注中...", true); // 錯誤:啟動即顯示
mHandler.sendEmptyMessageDelayed(0, 3000); // 錯誤:未點擊就發送延遲消息
// ...
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
private ProgressDialog dialog;
private int state = 0; // 0: 未關注, 1: 已關注
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (dialog != null && dialog.isShowing()) dialog.dismiss();
if (state == 1) {
btn.setText("已關注");
btn.setEnabled(true);
Toast.makeText(MainActivity.this, "關注成功", Toast.LENGTH_SHORT).show();
} else {
btn.setText("加關注");
btn.setEnabled(true);
Toast.makeText(MainActivity.this, "取消關注成功", Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.bt1);
btn.setOnClickListener(this);
btn.setText("加關注");
btn.setEnabled(true);
// 關鍵:onCreate 不顯示對話框,不發送消息
}
@Override
public void onClick(View v) {
if (v.getId() != R.id.bt1) return;
btn.setEnabled(false); // 防止重複點擊
if (state == 0) { // 當前未關注 -> 執行關注
btn.setText("關注中...");
dialog = ProgressDialog.show(this, "", "關注中...", true);
// 模擬網絡請求
new Thread(() -> {
try { Thread.sleep(3000); } catch (InterruptedException ignored) {}
runOnUiThread(() -> {
state = 1;
handler.sendEmptyMessage(0);
});
}).start();
} else { // 當前已關注 -> 執行取消關注
btn.setText("取消關注中...");
dialog = ProgressDialog.show(this, "", "取消關注中...", true);
new Thread(() -> {
try { Thread.sleep(3000); } catch (InterruptedException ignored) {}
runOnUiThread(() -> {
state = 0;
handler.sendEmptyMessage(0);
});
}).start();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (dialog != null && dialog.isShowing()) dialog.dismiss();
handler.removeCallbacksAndMessages(null); // 防止內存洩漏
}
}
| 問題 | 修正 |
|---|---|
| onCreate 顯示對話框 | 移至 onClick 內,按用戶操作觸發 |
| Handler 發送延遲消息無條件 | 僅在線程任務完成後 runOnUiThread 發送 |
| flag 邏輯混亂 | 改用明確的 state 枚舉 (0/1) |
| 線程更新 UI 直接操作 View | 使用 runOnUiThread 或 Handler(Looper.getMainLooper()) |
| Activity 銷毀時對話框未關閉 | onDestroy 中 dismiss() 並清理 Handler |
ProgressDialog 已在 API 26 棄用。建議使用:
setVisibility(View.VISIBLE/GONE) 控制。lifecycleScope.launch { ... } 管理異步任務生命周期。