The problem is in your for loop. When you post the runnable, you always post in to run 2000ms in the future from the current point in time. When your code runs, it post these actions almost simultaneously. Thus you see your output occur 2 seconds later, happening at the same time. Instead, you could do what I do below, where I post it a multiple of 2000ms in the future, based upon which word you are working on.
for (int counter=0; counter<=wordsInSentence-1; counter++){
String c= addWordsOut(wordsOut[counter], partialSentence);
textViewPartial.setText(c);
partialSentence = c;
Log.d("Word", partialSentence);
final String partialOut=c;
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
textViewPartial.setText(partialOut);
Log.d("Handler", partialOut);
}
} , 2000*(counter+1));
}
As for your implementation, I'd recommend posting each new runnable as the previous one completes. Otherwise, you could create and post many runnables, eating into your memory usage unnecessarily, and making cleanup of the handlers a pain. For an initial POC, this isn't too bad and can be easily changed later.