【发布时间】:2012-04-04 12:19:10
【问题描述】:
我对这个有点迷茫。如何获得 OutOfBounds?是否有大小限制(除了 sizeof (int))?
也许是因为多线程可以来这里? UI 线程和 Service 线程?
java.lang.ArrayIndexOutOfBoundsException 在 kenyu73.realsignal.DatabaseWrapper.getSignalValues(DatabaseWrapper.java:137) 在 kenyu73.realsignal.DatabaseWrapper.getSignalValues(DatabaseWrapper.java:116) 在 kenyu73.realsignal.BarScaleGraph$buildGraphThread.drawGraph(BarScaleGraph.java:128) 在 kenyu73.realsignal.BarScaleGraph$buildGraphThread.execute(BarScaleGraph.java:94) 在 kenyu73.realsignal.BarScaleGraph$buildGraphThread.run(BarScaleGraph.java:74)
另外,我用一个静态实例来调用这些类方法。我认为线程正在竞争相同的变量???想法?
BarScaleGraph 类
ContentValues[] values = DatabaseWrapper.getInstance().getSignalValues(getContentResolver(), signal_type, false);
DatabaseWrapper 类
private static final DatabaseWrapper instance = new DatabaseWrapper();
// grab static instance so we only have one db wrapper
public static DatabaseWrapper getInstance() {
return instance;
}
. . . .
public ContentValues[] getSignalValues(ContentResolver cr, int signal_type_id, boolean bGroupByLatLon) {
String sWhere = "signal_type_id=" + signal_type_id;
Cursor cursor;
if (bGroupByLatLon) {
cursor = cr.query(CONSTS.CONTENT_URI_GRP_LATLNG, null, sWhere, null, null);
} else {
cursor = cr.query(CONSTS.CONTENT_URI_LOGGER, null, sWhere, null, null);
}
ContentValues[] values = new ContentValues[cursor.getCount()];
int count = 0;
if (cursor.getCount() > 0) {
cursor.moveToFirst();
do {
values[count] = new ContentValues(); // <--- LINE 137
values[count].put("signal_value", cursor.getInt(cursor.getColumnIndex("signal_value")));
values[count].put("latitude", cursor.getInt(cursor.getColumnIndex("latitude")));
values[count].put("longitude", cursor.getInt(cursor.getColumnIndex("longitude")));
values[count].put("timestamp", cursor.getLong(cursor.getColumnIndex("timestamp")));
values[count].put("network", cursor.getString(cursor.getColumnIndex("network")));
count++;
} while (cursor.moveToNext());
}
cursor.close();
return values;
}
EDIT:要试试这个 - 将 synchronized 添加到实例
// grab static instance so we only have one db wrapper
public static synchronized DatabaseWrapper getInstance() {
return instance;
}
【问题讨论】:
-
你从未在你的 sn-p 中声明一个数组。发布此内容将有助于我们解决您的问题。
-
你在哪方面得到了例外?
-
这种情况很少发生。我只收到过两份报告。该方法被多个线程调用。我想知道是不是这个原因?有一个 UI 和一个服务线程。
-
更新帖子以包含可能的线程问题...
-
您是否尝试过同步该方法?