- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的测试中,我在 ActivityManagerService 的 updateOomAdjLocked() 中看到以下异常:
// java.lang.IndexOutOfBoundsException: Invalid index 27, size is 27
// at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
// at java.util.ArrayList.get(ArrayList.java:304)
// at com.android.server.am.ActivityManagerService.updateOomAdjLocked(ActivityManagerService.java:13880)
// at com.android.server.am.ActivityManagerService.updateLruProcessLocked(ActivityManagerService.java:1904)
// at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:647)
// at com.android.server.am.ActivityStack.startSpecificActivityLocked(ActivityStack.java:803)
有问题的代码似乎如下(Android 4.2.2 r1.2 的第 13850 行):
final ArrayList<ProcessRecord> mLruProcesses
= new ArrayList<ProcessRecord>();
{...}
final void updateOomAdjLocked() {
{...}
final int N = mLruProcesses.size();
for (i=0; i<N; i++) {
ProcessRecord app = mLruProcesses.get(i);
{...}
}
如果在循环中调用了 mLruProcesses.remove,则 mLruProcesses.get(i) for i=N 访问了一个不存在的索引,从而触发异常。
到目前为止我对 Android 服务知之甚少,所以我的问题是这段代码是否需要重新输入,也许是通过使某些操作线程安全?
最佳答案
您可以验证 mLruProcess.size()
的大小在您的循环中仍然等于 N
。
final boolean updateOomAdjLocked() {
{...}
final int N = mLruProcess.size();
for(int i = 0; i < N; i++) {
if(N != mLruProcess.size()) {
//Do something accordingly, in this case return false
return false;
}
ProcessRecord app = mLruProcess.get(i);
{...}
}
{...}
return true;
}
在你调用这个函数的地方添加一些逻辑,如果它返回 false 尝试让它再次调用这个函数。否则,您可以将 mLruProcess
放在 Synchronized
block 中,这意味着它只能在一个并发线程中访问。 Synchronized
关键字是阻塞的,这意味着任何试图在另一个线程中访问 mLruProcess
的代码都将被阻塞,直到当前线程完成 mLruProcess。
如果您不喜欢或不能使用阻塞代码,请尝试使用 AtomicBoolean
,如下所示:
When to use synchronized in Java
每当您更改存储在mLruProcess
中的对象时设置AtomicBoolean
,然后在您需要访问存储在mLruProcess
.
关于android - updateOomAdjLocked() 中的 throwIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555307/
在我的测试中,我在 ActivityManagerService 的 updateOomAdjLocked() 中看到以下异常: // java.lang.IndexOutOfBoundsExcept
我是一名优秀的程序员,十分优秀!