Jimit
Jimit

Reputation: 73

Display values in ArrayList one by one in textView

I am trying to display values inside ArrayList on single line textView one by one after some interval. How to achieve this without blocking the main thread?

I have written code which is able to do this with Thread.sleep but, after a few seconds of running, activity is getting crashed. I have used For Loop & Thread.sleep to iterate every ArrayList value after some interval.

When activity crashes, I am getting IndexOutOfBondException after a few seconds of running.

public void errorRepeater() {

    Thread t = new Thread() {

        @Override
        public void run() {
            //  !isInterrupted()

            while (!isInterrupted()) {
                for (xz = 0; xz < errorList.size(); xz++) {
                    try {
                        Thread.sleep(2000);  //1000ms = 1 sec

                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                String sErrorList = errorList.get(xz);
                                String sErrorListOkBox = errorListOkBox.get(xz);
                                Log.i("MQTT sErrorList", sErrorList);
                                TextView tvC1HPLP = findViewById(R.id.errormsg);
                                tvC1HPLP.setText(sErrorList);
                                TextView tvok = findViewById(R.id.ok);
                                tvok.setText(sErrorListOkBox);
                                rl.setBackgroundResource(R.drawable.errorred);
                                tvC1HPLP.setTextColor(Color.RED);

                            }
                        });

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };

    t.start();

}

textView should display values inside ArrayList one by one without crashing activity.

Upvotes: 0

Views: 96

Answers (1)

DHAVAL A.
DHAVAL A.

Reputation: 2321

Just for reference, you can try something like this.

   // You can define those both textview globally.
   TextView tvC1HPLP = findViewById(R.id.errormsg);
   TextView tvok = findViewById(R.id.ok);

   Handler mHandler = new Handler();
   final Runnable runnable = new Runnable() {
     int count = 0;
     @Override
     public void run() {

         String sErrorList = errorList.get(count%errorList.size);
         String sErrorListOkBox = errorListOkBox.get(count%errorListOkBox.size);

         tvC1HPLP.setText(sErrorList);

         tvok.setText(sErrorListOkBox);
         rl.setBackgroundResource(R.drawable.errorred);
         tvC1HPLP.setTextColor(Color.RED);
         count++;
         mHandler.postDelayed(this, 4000); // four second in ms
     }
   };
   mHandler.postDelayed(runnable, 1000);

Upvotes: 1

Related Questions