Я немного потерял это. Как я могу получить OutOfBounds? Есть ли ограничение по размеру (кроме sizeof (int))?ArrayIndexOutOfBoundsException error ... почему?
Возможно, потому что несколько нитей может сюда приехать? Линия пользовательского интерфейса и нить службы?
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: Собираюсь попробовать это - добавить синхронизированный к экземпляру
// grab static instance so we only have one db wrapper
public static synchronized DatabaseWrapper getInstance() {
return instance;
}
Вы никогда не объявляли массив в своем фрагменте. Проводка этого поможет нам решить вашу проблему. –
В чем же вы получаете исключение? –
Этого не бывает много. У меня было только два отчета об этом. Этот метод вызывается несколькими потоками. Мне интересно, если это причина? Существует пользовательский интерфейс и поток услуг. – kenyu73