Когда прибывает новый объект из базы данных, создается новый обработчик, который отправляет объект в поток пользовательского интерфейса, чтобы пользовательский интерфейс обрабатывал и рисовал объект.
public void notify(MyObject myObject) {
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
myview.handleUpdate(myObject);
}
};
handler.post(runnable);
}
Это работает отлично, но когдаОдновременно поступает 100 сообщений, будет создано 100 потоков, и это создает узкое место.
Я хотел бы дать обработчику подождать 2 секунды, прежде чем он запустится, чтобы он мог ждать других объектов.
Я пробовал следующее, но это не работает.Поток будет инициирован, но ждет 2 секунды других объектов, которые будут добавлены в список.Когда время истечет, поток будет добавлен в основной поток со всеми объектами.
boolean wait = false;
ArrayList<MyObject> myObjectList = new ArrayList<>();
public void notify(MyObject myObject) {
if(wait) {
myObjectList.add(myObject); // handler waits already, just add the object to the list
return;
}
wait = true; // says that the handler waits for data
myObjectList.add(myObject);
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
Thread.sleep(2000); // wait for 2 seconds
myview.handleUpdate(new ArrayList<>(myObjectList));
wait = false; // posted, a new handler can be created
myObjectList.clear();
}
};
handler.post(runnable);
}