Ошибка IndexOutOfBoundsException на устройстве Android, а не на эмуляторе - PullRequest
1 голос
/ 03 февраля 2011

Вот проблема, с которой я сейчас сталкиваюсь с моим приложением для Android. Программа отлично работает на эмуляторе без каких-либо ошибок, но выдает ошибки на реальном устройстве под управлением той же ОС.

  1. У меня есть служба обновления виджетов приложений, которая обновляет мой виджет. Этот сервис проверяет, находится ли виджет на экране, иначе не проходит процесс обновления. Прекрасно работает на эмуляторе.

  2. Каждый раз, когда виджет должен обновляться в методе OnReceive, я записываю намерение в строковую переменную check_intent, которая сообщает мне о намерениях ENABLED, DELETED или UPDATE.

  3. У меня есть таблица SQLite tuuserid_widget_enabled, в которой включено только одно поле. Когда намерение включено, я переключаю его на 1, а при удалении я переключаю его на 0. Работает нормально.

  4. Когда целью является ОБНОВЛЕНИЕ, я проверяю, является ли поле включения в таблице БД = 1, если истина, тогда я продолжаю обновление. Здесь я получаю сообщение об ошибке Cursor Index Out of Bounds на устройстве, но на эмуляторе все работает как положено.

Буду признателен за любую помощь в этом. Заранее спасибо. Извините, если я сделал что-то не так, я просто изучаю Android.

Вот ошибка -

    02-02 18:58:03.007: ERROR/AndroidRuntime(4292): FATAL EXCEPTION: main
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): java.lang.RuntimeException: Unable to start service Test.TU.TUWidget$UpdateService@45d2b7d0 with Intent { cmp=Test.TU/.TUWidget$UpdateService }: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.app.ActivityThread.access$3600(ActivityThread.java:135)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.os.Looper.loop(Looper.java:144)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.app.ActivityThread.main(ActivityThread.java:4937)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at java.lang.reflect.Method.invokeNative(Native Method)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at java.lang.reflect.Method.invoke(Method.java:521)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at dalvik.system.NativeStart.main(Native Method)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at Test.TU.TUWidget$UpdateService.onStart(TUWidget.java:209)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.app.Service.onStartCommand(Service.java:420)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267)
02-02 18:58:03.007: ERROR/AndroidRuntime(4292):     ... 10 more

Вот фрагменты кода.

@Override
    public void onReceive(Context context, Intent intent) {
        check_intent = intent.getAction();
        widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate,PendingIntent.FLAG_UPDATE_CURRENT);
        alarms.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+ PERIOD, newPending);
        context.startService(new Intent(context, UpdateService.class));
}

 public static class UpdateService extends Service {

        @Override
        public void onStart(Intent intent, int startId) {

        if (check_intent.contains("APPWIDGET_ENABLED")){
            TUDB tdb = new TUDB(getApplicationContext());
            final SQLiteDatabase db = tdb.getReadableDatabase();
            String update_sql = "update tuuserid_widget_enabled set enabled = '1';";
            if(db.isOpen() && !db.isReadOnly()){
                db.execSQL(update_sql);
                db.close();
            }
        }
        else
        **if (check_intent.contains("APPWIDGET_UPDATE")){
            TUDB tdb1 = new TUDB(getBaseContext());
            final SQLiteDatabase db1 = tdb1.getReadableDatabase();
            String check_widget_enabled = "select enabled from tuuserid_widget_enabled;";
            if(db1.isOpen() && !db1.isReadOnly()){
                Cursor cur = db1.rawQuery(check_widget_enabled, null); 
                cur.moveToFirst();
                widget_enabled = cur.getInt(0); //this is where it bombs
                cur.close();
                db1.close();
            }**
            if (widget_enabled == 1){
                RemoteViews updateViews = buildUpdate(getApplicationContext());
                          ComponentName thisWidget = new ComponentName(getApplicationContext(), TUWidget.class);
                AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
                manager.updateAppWidget(thisWidget, updateViews);   
            }
        }
        else
        if (check_intent.contains("APPWIDGET_DELETED")){
            TUDB tdb = new TUDB(getBaseContext());
            final SQLiteDatabase db = tdb.getReadableDatabase();
            String update_sql = "update tuuserid_widget_enabled set enabled = '0';";
            if(db.isOpen() && !db.isReadOnly()){
                db.execSQL(update_sql);
                db.close();
            }
        }

    }

1 Ответ

1 голос
/ 03 февраля 2011

Ваш курсор / база данных, вероятно, пуста - без строк. Попробуйте:

if (cur.moveToFirst()) { // returns false if cursor is empty
    widget_enabled = cur.getInt(0);
} else {
    widget_enabled = 0;
}
...