Reputation: 301
I am trying to change the text of a TextView after clicking a button. The text will display a countdown of seconds so the setText()
function gets called several times inside a loop. The text never changes until after the entire onClickTrain
function is finished.
I'm using fragments.
The Log.d(...) displays everything perfectly so I know the process is okay.
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.fragment_classification, container, false);
assert v != null;
liveView = (TextView)v.findViewById(R.id.textView3);
View trainButton = v.findViewById(R.id.train);
trainButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
onClickTrain(v);
}
});
return v;
}
public void onClickTrain(View v) {
for(int i=0;i<numGestures;i++) {//countdown to train each gesture
for (int countDown = 3; countDown > 0; countDown--) {//count down from 3
Log.d("Hold ", ListElements[i] + " in " + String.valueOf(countDown));
liveView.setText("Hold " + ListElements[i] + " in " + String.valueOf(countDown));
SystemClock.sleep(1000);//wait 1 second
}
fcalc.setTrain(true);
SystemClock.sleep(100);
while(fcalc.getTrain()){
//wait until training data is full
}
}
Log.d("size of train vector: ", String.valueOf(fcalc.samplesClassifier.size()));
fcalc.Train();
fcalc.setClassify(true);
}
Any idea why the text is not displaying? I have tried using handlers in several different places.
Any input is appreciated. Thanks.
Upvotes: 0
Views: 283
Reputation: 40
You can use a handler to add a delay. If you use Thread.Sleep(5000)
it will make the UI irresponsive.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Do something here
}
}, 5000);
Upvotes: 0
Reputation: 93678
DO not sleep on the UI thread. This makes the app freeze. Redrawing requires the app to return control to the Looper in the event loop that calls your click handler. So if you sleep, your changes will not show.
Upvotes: 1