我有一個函數:fillFromDB
它填充從SQLite數據庫調用list
ArrayList
的實例。同步塊android
我也有另一種Thread
這是假設清除list
和重新填充它。
我在列表中遇到了一些問題,因爲有時候其他Thread
清除列表,而第一個仍在填充列表,導致適配器上的IndexOutOfBoundsException
。
// This occurs onCreate()
fillFromDb(list);
downloadAndRepopulateList(list);
private void downloadAndRepopulateList(List list) {
new Thread(new Runnable() {
@Override public void run() {
list.clear();
// Some other clode
}
}
}
我知道,這個問題是因爲他們不是線程安全的,但我從來沒有使用過。
所以我的問題是:
如果我改變這樣的下載功能:
private void downloadAndRepopulateList(List list) {
new Thread(new Runnable() {
@Override public void run() {
synchronized(list) {
list.clear();
// Some other clode
}
}
}
}
將它等待UIThread先填完上fillFromDb()
名單,然後進行清除和重新填充?
如果不是,我該怎麼做?
所以downloadAndRepopulateList()方法被調用同步關鍵字內,並且還具有在他的身體同步關鍵字? –
是的。調用'synchornized(list)'的線程持有鎖對象。在這種情況下,你的其他線程。因此它是必要的 – Jatin