Threadsicherheit beim Durchlaufen einer ArrayList mit foreach
Ich habe einArrayList
, das instanziiert und im Hintergrund-Thread aufgefüllt wird (ich verwende es, um das @ zu speicheCursor
Daten). Gleichzeitig kann auf den Haupt-Thread zugegriffen und mit foreach durchlaufen werden. Dies kann offensichtlich dazu führen, dass eine Ausnahme ausgelöst wird.
Meine Frage ist, wie man dieses Klassenfeld am besten threadsicher macht, ohne es jedes Mal zu kopieren oder Flags zu verwenden?
class SomeClass {
private final Context mContext;
private List<String> mList = null;
SomeClass(Context context) {
mContext = context;
}
public void populateList() {
new Thread(new Runnable() {
@Override
public void run() {
mList = new ArrayList<>();
Cursor cursor = mContext.getContentResolver().query(
DataProvider.CONTENT_URI, null, null, null, null);
try {
while (cursor.moveToNext()) {
mList.add(cursor.getString(cursor.getColumnIndex(DataProvider.NAME)));
}
} catch (Exception e) {
Log.e("Error", e.getMessage(), e);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}).start();
}
public boolean searchList(String query) { // Invoked on the main thread
if (mList != null) {
for (String name : mList) {
if (name.equals(query) {
return true;
}
}
}
return false;
}
}