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

Android 實現「關注/取消關注」按鈕切換與 ProgressDialog/Toast 協調顯示

     編輯:程式設計疑難解答

需求:點擊「加關注」→ 顯示 ProgressDialog → 3 秒後關閉 → 文字變「已關注」 → 彈 Toast;再次點擊反向操作。原代碼中 Toast 與 Dialog 同時出現,且子線程 sleep 不阻塞主線程,導致時序混亂。

正確模式:Handler 延遲消息

在 UI 線程用 Handler.sendEmptyMessageDelayed 控制時序,避免手動開線程 sleep。

private Handler mHandler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        dialog.dismiss();
        button.setEnabled(true);
        button.setText(isFollowing ? "加關注" : "已關注");
        Toast.makeText(MainActivity.this, 
            isFollowing ? "取消關注成功" : "關注成功", 
            Toast.LENGTH_SHORT).show();
        isFollowing = !isFollowing;
    }
};

button.setOnClickListener(v -> {
    button.setEnabled(false);
    dialog = ProgressDialog.show(this, "", isFollowing ? "取消關注中..." : "關注中...", true);
    mHandler.sendEmptyMessageDelayed(0, 3000); // 3 秒後處理 UI 更新
});

優勢

  • 所有 UI 操作在主線程,安全無崩潰風險。
  • 時序精確:Dialog 顯示 → 3 秒 → Dialog 消失 → 文字切換 → Toast 彈出。
  • 代碼簡潔,避免匿名內部類線程嵌套。

若需網絡請求,將 handleMessage 中的邏輯換為發起請求,請求回調再發送消息更新 UI。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved