Android list timer in every second

I have a problem using a timer on listview. In the list item, I showed the use of sqlite values. There is textviewone that shows the time difference of the last updated data time and the current time. I have to show it every second. so the user can find out how long he updated the record.

I tried this in several ways.

First way

I tried to add a timer to the class adapter. therefore, a new timer is created for each item. therefore, the application crashed due to the simultaneous launch of several timers.

Second way

I tried using the adapter.notifyDataSetChanged () method. Like this.

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() { 
        if (adapterChatThread != null) {
            adapter.notifyDataSetChanged();
        }
        timerHandler.postDelayed(this, 1000); // run every second
    }
};
timerRunnable.run();

, , Activity.

Onresume

timerHandler.postDelayed(timerRunnable, 500);

OnPause

timerHandler.removeCallbacks(timerRunnable);

- . , . 2 , 5 , ..

, , .

.

class ThreadTimer extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (adapter != null)
            adapter.notifyDataSetChanged();
        super.onPostExecute(result);
    }
    }

,

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() { 
        new ThreadTimer().execute();
        timerHandler.postDelayed(this, 1000); // run every second
    }
};
timerRunnable.run();

. ( )

AsyncTask

class ThreadTimer extends AsyncTask<Void, Void, Void> {
    void Sleep(int ms) {
        try {
            Thread.sleep(ms);
        } catch (Exception e) {
        }
    }

    @Override
    protected Void doInBackground(Void... params) {
        while (threadRun) {
            Sleep(1000);
            return null;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        adapter.notifyDataSetChanged();
        super.onPostExecute(result);
    }
}

OnResume. threadRun = false;

.

, .

- .

.

.

Date lastUpdatedTime;
final ChatThreadDAO ctd = new ChatThreadDAO();
long timeForNextResponse = ctd.getLastRespondedTime(vct.get(position).getThread_id());

try {
    if (vct.get(position).getThread_read_status() == 1 && timeForNextResponse > 0) {
        final long respTime = timeForNextResponse;
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        lastUpdatedTime = formatter.parse(vct.get(position).getLast_updated_time());
        final long timeDiff = (new Date()).getTime() - lastUpdatedTime.getTime();
        if (timeDiff <= respTime) {
            timeForNextResponse = respTime - timeDiff;
            ctd.updateTimeRespondToLastMsg(vct.get(position).getThread_id(), timeForNextResponse);
            holder.tvChatTimer.setVisibility(View.VISIBLE);
            holder.tvChatTimer.setText(timeForNextResponse / 1000 + "");
        } else {
            ctd.updateTimeRespondToLastMsg(vct.get(position).getThread_id(), 0);
        }
    } else {
        holder.tvChatTimer.setVisibility(View.INVISIBLE);
    }
} catch (ParseException e) {
    e.printStackTrace();
}

vct

vct;

.

+4
1

, .

private class connectionControl extends Thread {
        boolean stop_ = false;

        public void stop_() {
            this.stop_ = true;
        }

        public void run() {
            System.out.println("Thread started:" + getClass().getSimpleName());
            while(!this.stop_) {
                try {
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            Calendar c = Calendar.getInstance(); 
                            int rightNow = c.get(Calendar.SECOND) + c.get(Calendar.MINUTE)*60;
                            if(rightNow - lastUpdatedTime > 10) {
                                wirelessIcon.setImageResource(R.drawable.wirelessred);
                            }
                            else if(rightNow - lastUpdatedTime > 5) {
                                wirelessIcon.setImageResource(R.drawable.wirelessyellow);
                            }
                            else {
                                wirelessIcon.setImageResource(R.drawable.wirelessgreen);
                            }
                        }
                    });

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("Thread stoped:" + getClass().getSimpleName());
        }
    }

lastUpdatedTime , rightNow, notifyDataSetChanged() .

0

Source: https://habr.com/ru/post/1532291/


All Articles