Data doubles every time when i press the button



I print the milliseconds on the screen in hours, minutes, seconds. However, when I press the button, it doubles the data received with each click. For example; When 5 minutes and 10 seconds of data comes in, when I click the button again, the data appears as 10 minutes and 20 seconds. The data is multiplied by 2 each time we click the button. How can i fix that?

butondata.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String currentDateandTime = sdf.format(new Date());
        startData = FirebaseDatabase.getInstance().getReference()
                .child("totals")
                .child(moTracks);
        PeriodHow = startData.orderByChild("availableDate").equalTo(String.valueOf(currentDateandTime));
        PeriodHow.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    if (data.child("availableDate").exists()) {

                        long seconds = (data.getValue(SecondsPeriod.class).getDuration().getSeconds());
                        long minute = (data.getValue(SecondsPeriod.class).getDuration().getMinutes());
                        long hours = (data.getValue(SecondsPeriod.class).getDuration().getHours());
                        vanminit = vanminit + minute;
                        vanhours = vanhours + hours;
                        aggregator = aggregator + seconds;
                        long fminute = vanminit*60*1000;
                        long fhours = vanhours*60*60*1000;
                        long fseconds = aggregator*1000;
                        long asd = fhours + fminute + fseconds;
                      
                        if (asd < 0) {
                            throw new IllegalArgumentException("Duration must be greater than zero!");
                        }

                        long hrs = TimeUnit.MILLISECONDS.toHours(asd);
                        asd -= TimeUnit.HOURS.toMillis(hrs);
                        long mint = TimeUnit.MILLISECONDS.toMinutes(asd);
                        asd -= TimeUnit.MINUTES.toMillis(mint);
                        long scnd = TimeUnit.MILLISECONDS.toSeconds(asd);

                        StringBuilder sb = new StringBuilder(64);
                        sb.append(hours);
                        sb.append(" Hours ");
                        sb.append(mint);
                        sb.append(" Minutes ");
                        sb.append(scnd);
                        sb.append(" Seconds");
                        timedetails.setText(sb.toString());
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }
});

Answer

migrate these variables

vanminit = vanminit + minute;
vanhours = vanhours + hours;
aggregator = aggregator + seconds;

to local ones by adding long before each

long vanminit = vanminit + minute;
long vanhours = vanhours + hours;
long aggregator = aggregator + seconds;

don’t keep them class available (declared on top of file above moethods), as they accumulate on each onDataChange call

btw. asd or fseconds aren’t best variable names…

edit: if you want to store these values in class to be available for other methods then just copy them to class-available variables

long vanminit = vanminit + minute;
long vanhours = vanhours + hours;
long aggregator = aggregator + seconds;
vanminitGlobal = vanminit;
vanhoursGlobal = vanhours;
aggregatorGlobal = aggregator;

in other methods use Global variables



Source: stackoverflow