Возможно, проблема в том, что вы должны выполнить метод ImageChange.doInBackground()
в потоке пользовательского интерфейса.Попробуйте изменить свой код следующим образом:
class ImageChange extends AsyncTask<Void, Void, Void> {
Activity act;
public ImageChange(Activity act) {
this.act = act;
}
protected void onPostExecute(Void unused) {
iv1.setImageBitmap(b1);
iv2.setImageBitmap(b2);
}
protected Void doInBackground(Void... arg0) {
switch(count) {
case 1:
helperMethod(f1.getAbsolutePath(), f2.getAbsolutePath());
break;
case 2:
helperMethod(f2.getAbsolutePath(), f1.getAbsolutePath());
break;
default :
count = 0;
helperMethod(f1.getAbsolutePath(), f2.getAbsolutePath());
break;
}
return null;
}
private void helperMethod(String a, String b) {
act.runOnUIThread(new Runable() {
public void run() {
b1 = BitmapFactory.decodeFile(a);
b2 = BitmapFactory.decodeFile(b);
}
});
}
}
Обратите внимание, что вы должны передать Activity в конструктор класса ImageChange.Это означает, что вы должны вызывать asyncTask следующим образом:
new ImageChange(this).execute();
Также рассмотрите возможность использования класса TimerTask
EDIT: изменить часть действияВаш код с этим:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
.................
new ImageChange().execute();
} // OnCreate End
И добавьте while(true)
к классу ImageChange:
protected Void doInBackground(Void... arg0) {
while(true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = count + 1;
switch(count) {
...
}
}
return null;
}
EDIT2: Вы можете решить проблему вставки кода, который должен быть выполнен в onPostExecuteпосле каждой итерации внутри цикла while:
protected Void doInBackground(Void... arg0) {
while(true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = count + 1;
switch(count) {
...
}
act.runOnUIThread(new Runnable() {
public void run() {
iv1.setImageBitmap(b1);
iv2.setImageBitmap(b2);
}
});
}
return null;
}
Код, который вы вставляете в цикл while, должен выполняться в потоке пользовательского интерфейса;фактически каждый метод onPostExecute класса AsyncTask выполняется в потоке пользовательского интерфейса.