Fix: WindowManagerGlobal#setStoppedState failed by IOOBE
Symptom: An application crashed due to IndexOutOfBoundsException. The exception was thrown at WindowManagerGlobal#setStoppedState. Root cause: setStoppedState invokes setWindowStopped for each ViewRoot by ascending order. If an application removes its view within the loop, loop index exceeds the number of items. Solution: Loop in descending order. Bug: 69018607 Change-Id: I7e20282dc99b767912be4e00d81ffb49fe6c7ac0
This commit is contained in:
committed by
Takamasa Kuramitsu
parent
ee56b4a65c
commit
978e7f87cc
@@ -605,9 +605,10 @@ public final class WindowManagerGlobal {
|
||||
public void setStoppedState(IBinder token, boolean stopped) {
|
||||
synchronized (mLock) {
|
||||
int count = mViews.size();
|
||||
for (int i = 0; i < count; i++) {
|
||||
for (int i = count - 1; i >= 0; i--) {
|
||||
if (token == null || mParams.get(i).token == token) {
|
||||
ViewRootImpl root = mRoots.get(i);
|
||||
// Client might remove the view by "stopped" event.
|
||||
root.setWindowStopped(stopped);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user