首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android ProgressDialog 邏輯錯誤導致啟動即顯示「取消關注」

     編輯:程式設計疑難解答

問題現象

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 棄用。建議使用:

  • MaterialDialog / LovelyDialog 庫。
  • ProgressBar 放入布局,setVisibility(View.VISIBLE/GONE) 控制。
  • SwipeRefreshLayout 下拉刷新場景。
  • Kotlin 協程 + lifecycleScope.launch { ... } 管理異步任務生命周期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved