Android TimerTask导致“错误”;“访问关闭光标”;强行关闭

Android TimerTask导致“错误”;“访问关闭光标”;强行关闭,android,cursor,timertask,Android,Cursor,Timertask,我有一个TimerTask,当我转到其他目的时,它会导致我的应用程序崩溃。以下是错误: 06-06 02:45:54.884: E/AndroidRuntime(602): FATAL EXCEPTION: main 06-06 02:45:54.884: E/AndroidRuntime(602): android.database.StaleDataException: Access closed cursor 06-06 02:45:54.884: E/AndroidRuntime(602

我有一个TimerTask,当我转到其他目的时,它会导致我的应用程序崩溃。以下是错误:

06-06 02:45:54.884: E/AndroidRuntime(602): FATAL EXCEPTION: main
06-06 02:45:54.884: E/AndroidRuntime(602): android.database.StaleDataException: Access closed cursor
06-06 02:45:54.884: E/AndroidRuntime(602):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
06-06 02:45:54.884: E/AndroidRuntime(602):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
06-06 02:45:54.884: E/AndroidRuntime(602):  at com.myapp.ExerciseActivity$TickClass$1.run(ExerciseActivity.java:221)
06-06 02:45:54.884: E/AndroidRuntime(602):  at android.os.Handler.handleCallback(Handler.java:587)
06-06 02:45:54.884: E/AndroidRuntime(602):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-06 02:45:54.884: E/AndroidRuntime(602):  at android.os.Looper.loop(Looper.java:123)
06-06 02:45:54.884: E/AndroidRuntime(602):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-06 02:45:54.884: E/AndroidRuntime(602):  at java.lang.reflect.Method.invokeNative(Native Method)
06-06 02:45:54.884: E/AndroidRuntime(602):  at java.lang.reflect.Method.invoke(Method.java:507)
06-06 02:45:54.884: E/AndroidRuntime(602):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-06 02:45:54.884: E/AndroidRuntime(602):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-06 02:45:54.884: E/AndroidRuntime(602):  at dalvik.system.NativeStart.main(Native Method)
下面是TimerTask的代码:

public class TickClass extends TimerTask
{
    private int columnIndex;

    @Override
    public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (cursor != null) {
                        if (_index == 1) {
                            columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_2);
                            _index = 2;
                        }
                        else {
                            columnIndex = cursor.getColumnIndex(MySQLiteHelper.COLUMN_IMAGE_1);
                            _index = 1; 
                        }   

                        String image_1 = cursor.getString(columnIndex);
                        image_1 = image_1.replace(".png", "");
                        int resourceId = getResources().getIdentifier(getPackageName() + ":drawable/" + image_1, null, null);
                        image_1_view.setImageDrawable(getResources().getDrawable(resourceId));
                    }
                }
            });
        }
}
它所做的只是制作PNG动画

请注意,我是如何添加了
if(cursor!=null)
条件语句的,但没有修复它。我不知道如何解决这个问题,是不是因为它在UI线程上运行,所以即使我已经离开了活动,它仍然在运行,但是光标不再存在,因为它与活动绑定在一起了

编辑:


我已通过取消()将TimerTask onPause()设置为关闭()来修复力。但是,现在当我返回活动时,图像不再设置动画。有什么想法吗?

这样不合适

如果将
cursor
用作全局变量,则可以在
runOnUiThread
中使用,但我的意见是必须这样使用cursor

//get the record in cursor
if(Cur.getCount()!=0){
    if(Cur.moveToFirst()){
        do{
        //here you can manipulate your record

        }while(Cur.moveToNext());

    }
}
Cur.close();

这是一种完美的尝试和运行方式。

取消我的onPause()中的TimerTask修复了此问题。

游标!=空
只需告诉光标是否已初始化,关闭的
光标
与此无关,您肯定正在访问已关闭的
光标