Потоки в Java. runOnUiThread. Как справиться с утечкой памяти?
При нажатии на кнопку запускается поток в котором меняются картинки в активити с определенной периодичностью, но на андройде 5.1 (API 22) появляется ошибка связанная с потоком. Как я понял для изменения UI нужно дополнительно использовать runOnUiThread, но почему на других версиях все работает ?
Ошибка FATAL EXCEPTION: Thread-299 ndroid.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Код
public void OnClickStart(View view) {
if(!start_stop){
start_stop = true;
button_1.setText("Стоп");
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
while (start_stop) {
counter++;
switch (counter) {
case 1:
imageViewTraf.setImageResource(R.drawable.png1);
break;
case 2:
imageViewTraf.setImageResource(R.drawable.png2);
break;
case 3:
imageViewTraf.setImageResource(R.drawable.png3);
counter = 0;
break;
}
try {
Thread.sleep(var_int);
} catch (InterruptedException e) {
e.printStackTrace();
}
}}});
}
}).start(); }
else {
button_1.setText("Старт");
start_stop=false;
}
}
Если убрать runOnUiThread, то код работает и не вызывает ошибку на последних версиях андройда
Ответы (1 шт):
Тебе надо и цикл и Thread.sleep вынести из UI потока в родительский, а в UI делать только imageViewTraf.setImageResource.
public void OnClickStart(View view){
if(!start_stop){
start_stop=true;
button_1.setText("Стоп");
new Thread(new Runnable(){
@Override
public void run(){
while(start_stop){
counter++;
Resource resource;
switch(counter){
case 1:
resource = R.drawable.png1;
break;
case 2:
resource = R.drawable.png2;
break;
case 3:
resource = R.drawable.png3;
counter=0;
break;
}
if (resource) {
runOnUiThread(new Runnable() {
@Override
public void run() {
imageViewTraf.setImageResource(resource);
}
});
}
try{
Thread.sleep(var_int);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}).start();
} else {
button_1.setText("Старт");
start_stop = false;
}
}