Android Studio(Java) Firebase实时数据库点击计数无法递增问题
问题解决:Firebase实时数据库点赞/踩数无法递增
问题原因
每次点击按钮后调用finish()关闭当前Activity,下次进入时clickCount1和clickCount2会被重新初始化为0,点击一次后数值变为1并写入数据库,导致无论点击多少次,数据库里的Likes和Dislikes始终显示为1。此外,本地计数无法在App重启或Activity重建后保留,也无法处理多用户同时操作的并发冲突。
解决方案
方法1:使用Firebase原子递增操作(推荐)
直接让Firebase服务器处理数值递增,无需本地维护计数,彻底避免并发冲突和本地初始化问题:
修改按钮点击逻辑如下:
// Firebase Database mDatabase = FirebaseDatabase.getInstance().getReference(); likebutton = findViewById(R.id.imageButton11); downbutton = findViewById(R.id.imageButton10); // Like Button Action likebutton.setOnClickListener(v -> { // 原子递增Likes值 mDatabase.child("FeedBack").child("Likes").setValue(ServerValue.increment(1)); animationView1.playAnimation(); Intent intent = new Intent(MainActivity.this, Landscape.class); startActivity(intent); finish(); }); // Down Button Action downbutton.setOnClickListener(v -> { // 原子递增Dislikes值 mDatabase.child("FeedBack").child("Dislikes").setValue(ServerValue.increment(1)); animationView2.playAnimation(); Intent intent = new Intent(MainActivity.this, NotifActivity.class); startActivity(intent); finish(); });
同时可以删除本地的clickCount1、clickCount2变量,以及对应的incrementClickCount1()、incrementClickCount2()、saveClickCountToDatabase1()、saveClickCountToDatabase2()方法。
方法2:本地持久化计数(仅单用户场景)
如果必须本地维护计数,可使用SharedPreferences保存数值,避免Activity重建后重置:
private SharedPreferences prefs; private int clickCount1; private int clickCount2; private DatabaseReference mDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化SharedPreferences,读取已保存的计数 prefs = getSharedPreferences("ClickCounts", MODE_PRIVATE); clickCount1 = prefs.getInt("LikesCount", 0); clickCount2 = prefs.getInt("DislikesCount", 0); mDatabase = FirebaseDatabase.getInstance().getReference(); likebutton = findViewById(R.id.imageButton11); downbutton = findViewById(R.id.imageButton10); // Like Button Action likebutton.setOnClickListener(v -> { clickCount1++; // 将更新后的计数保存到SharedPreferences prefs.edit().putInt("LikesCount", clickCount1).apply(); mDatabase.child("FeedBack").child("Likes").setValue(clickCount1); animationView1.playAnimation(); Intent intent = new Intent(MainActivity.this, Landscape.class); startActivity(intent); finish(); }); // Down Button Action downbutton.setOnClickListener(v -> { clickCount2++; // 将更新后的计数保存到SharedPreferences prefs.edit().putInt("DislikesCount", clickCount2).apply(); mDatabase.child("FeedBack").child("Dislikes").setValue(clickCount2); animationView2.playAnimation(); Intent intent = new Intent(MainActivity.this, NotifActivity.class); startActivity(intent); finish(); }); }
注意:该方法在多用户同时操作时会出现数据不一致的问题,仅适合单用户使用场景,优先推荐方法1。
内容的提问来源于stack exchange,提问作者FishCakes
相关产品推荐
相关产品推荐

