1. 操作步骤:
--在Email帐号设置中, 选择ringtone; 按home 键;  N个没什么印象的操作; 在homescreen中按Email icon时, 抛出如何异常(之后没有再出现):I/ActivityManager(  127): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.email/.activity.Welcome bnds=[83,240][157,319] } from pid 228
E/Cursor  ( 5443): Invalid statement in fillWindow()
W/dalvikvm(  890): threadid=1: thread exiting with uncaught exception (group=0x40018560)
E/AndroidRuntime(  890): FATAL EXCEPTION: main
E/AndroidRuntime(  890): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
E/AndroidRuntime(  890):         at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
E/AndroidRuntime(  890):         at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
E/AndroidRuntime(  890):         at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
E/AndroidRuntime(  890):         at android.database.CursorWrapper.getString(CursorWrapper.java:135)
E/AndroidRuntime(  890):         at com.android.internal.database.SortCursor.getString(SortCursor.java:205)
E/AndroidRuntime(  890):         at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:130)
E/AndroidRuntime(  890):         at android.widget.CursorAdapter.getView(CursorAdapter.java:186)
E/AndroidRuntime(  890):         at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
E/AndroidRuntime(  890):         at android.widget.AbsListView.obtainView(AbsListView.java:1409)
E/AndroidRuntime(  890):         at android.widget.ListView.measureHeightOfChildren(ListView.java:1216)
E/AndroidRuntime(  890):         at android.widget.ListView.onMeasure(ListView.java:1127)
E/AndroidRuntime(  890):         at android.view.View.measure(View.java:8313)
E/AndroidRuntime(  890):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
E/AndroidRuntime(  890):         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
E/AndroidRuntime(  890):         at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
E/AndroidRuntime(  890):         at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
E/AndroidRuntime(  890):         at android.view.View.measure(View.java:8313)
E/AndroidRuntime(  890):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
E/AndroidRuntime(  890):         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
E/AndroidRuntime(  890):         at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
E/AndroidRuntime(  890):         at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
E/AndroidRuntime(  890):         at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60)
E/AndroidRuntime(  890):         at android.view.View.measure(View.java:8313)
E/AndroidRuntime(  890):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
E/AndroidRuntime(  890):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
E/AndroidRuntime(  890):         at android.view.View.measure(View.java:8313)
E/AndroidRuntime(  890):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
E/AndroidRuntime(  890):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
E/AndroidRuntime(  890):         at android.view.View.measure(View.java:8313)
E/AndroidRuntime(  890):         at android.view.ViewRoot.performTraversals(ViewRoot.java:841)
E/AndroidRuntime(  890):         at android.view.ViewRoot.handleMessage(ViewRoot.java:1862)
E/AndroidRuntime(  890):         at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  890):         at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(  890):         at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(  890):         at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  890):         at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(  890):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
E/AndroidRuntime(  890):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
E/AndroidRuntime(  890):         at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  127):   Force finishing activity android/com.android.internal.app.RingtonePickerActivity
W/ActivityManager(  127): Activity pause timeout for HistoryRecord{409a1238 android/com.android.internal.app.RingtonePickerActivity}
D/NotificationService(  127): enqueueNotificationInternal bCMASMessage: false
D/NotificationService(  127): enqueueNotificationInternal sound, vib2.查看了下RingtonePickerActivity, cursor是使用managedQuery获取的, 也没有发现cursor被冻结或关闭; 哪位知道根源, 或者知道如何提高重现概率、以便分析?

解决方案 »

  1.   

    Cursor索引超出范围异常~ 期待LX给出方案。
      

  2.   

     android.database.CursorWrapper.getString
    你给的index是不是不对?你看一下你要取的字段的index,可以打开db看一下。
      

  3.   


    数据库中有相关信息, index为0, 肯定没有问题的。从异常看,cursor内容是空的, 可以查询数据库的结果不应该为空。   之后没有重现过, 没法调试, 纠结。
      

  4.   

    关键是如何导致超出索引, 为什么cursor的count突然为0; 之前, 之后都不为0的。
      

  5.   

    看了一下code,是你的count为零导致的问题,最好发点code来看看,你说的之前之后不为零,啥意思?
    没有代码很难分析,或者是看一下你的查询语句是否有问题
      

  6.   


    1. 该activity继承关系:
        
    public final class RingtonePickerActivity extends AlertActivity implements
            AdapterView.OnItemSelectedListener, Runnable, DialogInterface.OnClickListener,
            AlertController.AlertParams.OnPrepareListViewListener {2. Curor的获取, 通过activity的manage query获取以及维护:
          public Cursor getCursor() {
            if (mCursor != null && mCursor.requery()/* && mCursor.getCount() > 0*/) {//92972
                return mCursor;
            }
           
            final Cursor internalCursor = getInternalRingtones();
            final Cursor drmCursor = mIncludeDrm ? getDrmRingtones() : null;
            final Cursor mediaCursor = getMediaRingtones();
    // US_csy 20111014 : [        // add vibration
            final Cursor vibrationCursor = (mType == TYPE_RINGTONE) ? getVibrationtones() : null;        return mCursor = new SortCursor(new Cursor[] { internalCursor, drmCursor, mediaCursor, vibrationCursor},
                    MediaStore.Audio.Media.DEFAULT_SORT_ORDER); 3. 问题的另一个关键点是, 从AccountSettings界面, 进入RingtonePickerActivity 没有问题;该问题是之后点击homescreen下应用图标,重新显示RingtonePickerActivity 出现的;并且, 重新操作, 没有重现。太诡异了。
       
      

  7.   

    要是方便的话、可以把你的这块的查询语句贴出来LOOK下、
      

  8.   

    你查询后的操作有没有进行if(cursor != null && cursor.moveToFirst()){}
    返回的cursor即使是1条信息、也必须要通过cursor.moveToFirst()、才能将游标对应到真正的这条数据】、
      

  9.   

    Cursor类中游标位置最初为-1;moveToFirst()方法将游标位置设置为0,即指向第一条数据;moveToPosition(int i)方法将游标位置设置为i,i的范围为-1到Cursor的行数。
      

  10.   


    我想知道的是为什么cursor的数量为0, 之前以及之后都不为0的.在代码中采用manage curosr查询, 只有这一个地方(当然cursor.requery没算)。 对这个cursor的赋值, 可以查看RingtoneManager.java的代码。郁闷!