DiamondHands
DiamondHands

Reputation: 21

Generate a random character everyone one second

My code needs to generate a random character from A to Z, using a new thread, every one second and display the output in the logcat. Right now I am able generate a new character using a new thread and display it in the logcat. However, my output displays too quickly. It's generating like 20 new threads in one second. I used new Timer().schedule(new TimerTask() and an interval of 10000. Can someone please help me fix my code to display 1 new thread display every 1 second?

private void generateRandomAlphabet() {
final Handler handler = new Handler();

//creates new thread every one second 
new Timer().schedule(new TimerTask(){
    @Override
    public void run(){
        //loop to create generate new thread in logcat until stop button is pressed
        while (running == true){
            
            //generate a random character
            Random rand = new Random();
            final char alphabet = alphabets.charAt(rand.nextInt(26));
            Log.d("RandomCharacter Service", "Thread ID is:" + Thread.currentThread().getId() + " , Random Character is: " + alphabet);
            handler.post(new Runnable() {
                @Override
                public void run() {
                     //display random character in logcat   
                    ((TextView) findViewById(R.id.textView)).setText("Random Number Service Home");
                }
            });
        }
    }
       //delay after start button is pressed is 0, interval between each thread is 10,000 ms
    }, 0,10000);
   }

   @Override
   public void onClick(View v){
       //generate new thread once button is clicked
      if(v.getId() == R.id.startService){
         running = true;
         Log.d("LogCat", "Service Started");
         generateRandomAlphabet();
     }
 //stop generating threads once button is clicked
if(v.getId() == R.id.stopService){
    Log.d("LogCat", "Service Stopped");
    running = false;
   }
 }
}

Upvotes: 0

Views: 162

Answers (1)

lyncx
lyncx

Reputation: 680

I haven't tested the code but you could try this

Handler handler = new Handler();
Runnable runnable;
int delay = 1000;

   @Override
   public void onClick(View v){
      
      if(v.getId() == R.id.startService){
        
        handler.postDelayed( runnable = new Runnable() {
        public void run() {
         Random rand = new Random();
         final char alphabet = alphabets.charAt(rand.nextInt(26));
         Log.d("RandomCharacter Service", "Random Character is:" + alphabet);
         handler.postDelayed(runnable, delay);
        }
       }, delay);
     }
 
if(v.getId() == R.id.stopService){
    handler.removeCallbacks(runnable);
   }
 }
}

Upvotes: 2

Related Questions