Използване на таймер в клас, разширяващ Content Observer

Разработвам приложение за Android, където моят клас разширява наблюдателя на съдържанието. Опитвам се да задействам таймер при натискане на бутона за намаляване на звука. Получавам принудително затваряне в рамките на моя метод на таймера при натискане на метода надолу. Трябва да внедря метода на таймера.

По-долу е моят logcat:

07-01 12:14:08.929: E/Service(10564): <!>com.ssn.testingaudiomanager.Serviceforshake 19<!> Service
07-01 12:14:14.079: E/changed(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 47<!> Volume6
07-01 12:14:14.089: E/delta(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 51<!> delta value 1
07-01 12:14:14.089: E/delta down & up(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 55<!> delta > 0 1
07-01 12:14:14.089: E/inside(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 78<!> timeemwthod
07-01 12:14:14.099: E/inside(10564): <!>com.ssn.testingaudiomanager.VolumeChecker$1 89<!> time run , time is0.0
07-01 12:14:14.099: E/inside(10564): <!>com.ssn.testingaudiomanager.VolumeChecker$1 94<!> time less than 2
07-01 12:14:14.149: E/changed(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 47<!> Volume6
07-01 12:14:14.149: E/delta(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 51<!> delta value 1
07-01 12:14:14.149: E/delta down & up(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 55<!> delta > 0 1
07-01 12:14:14.159: E/inside(10564): <!>com.ssn.testingaudiomanager.VolumeChecker 78<!> timeemwthod
07-01 12:14:14.159: E/AndroidRuntime(10564): FATAL EXCEPTION: main
07-01 12:14:14.159: E/AndroidRuntime(10564): java.lang.IllegalStateException: Timer was canceled
07-01 12:14:14.159: E/AndroidRuntime(10564):    at java.util.Timer.scheduleImpl(Timer.java:563)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at java.util.Timer.scheduleAtFixedRate(Timer.java:530)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at com.ssn.testingaudiomanager.VolumeChecker.timermethod(VolumeChecker.java:80)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at com.ssn.testingaudiomanager.VolumeChecker.onChange(VolumeChecker.java:57)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:43)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at android.os.Handler.handleCallback(Handler.java:587)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at android.os.Looper.loop(Looper.java:123)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at android.app.ActivityThread.main(ActivityThread.java:3729)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at java.lang.reflect.Method.invoke(Method.java:507)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
07-01 12:14:14.159: E/AndroidRuntime(10564):    at dalvik.system.NativeStart.main(Native Method)

Моля, погледнете моя код по-долу.

 public class VolumeChecker extends ContentObserver 
   {
  int initialVolume;
  Context context;
  Timer timer;
  float time = 0;

  String downpress = "no";

public VolumeChecker(Context c, Handler handler) 
{
    super(handler);
    context=c;

    AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    initialVolume = audio.getStreamVolume(AudioManager.STREAM_RING);

    timer = new Timer();

}

@Override
public boolean deliverSelfNotifications() 
{
    return super.deliverSelfNotifications();
}

@Override
public void onChange(boolean selfChange) 
{
    super.onChange(selfChange);

    AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int currentVolume = audio.getStreamVolume(AudioManager.STREAM_RING);

    Log.e("changed", "Volume"+currentVolume);

    int delta=initialVolume-currentVolume;

    Log.e("delta","delta value "+delta);

    if(delta>0)
    {
        Log.e("delta down & up","delta > 0 "+delta);

        timermethod();

    }

    else if(delta<0)
    {
        Log.e("delta up & down","delta < 0 "+delta);
    }

    else if(delta == 0)
    {
        Log.e("inisde","delta is 0 , shake it!!");

    }
}



public void timermethod()
{

    Log.e("inside","timeemwthod");

    timer.scheduleAtFixedRate(new TimerTask() 
    {

        @Override
        public void run() 
        {
            time = time++;


            Log.e("inside","time run , time is" + time);

            if(time <= 2)
            {

                Log.e("inside","time less than 2");

                timer.purge();
                timer.cancel();
            }

            if(time > 2)
            {

                Log.e("inside","time greater than 2");

                timer.purge();
                timer.cancel();
            }

        }



    }, 0, 1000);
}

} 

person Dave    schedule 01.07.2013    source източник
comment
Възможен дубликат: stackoverflow.com/q/9547267/1204134   -  person Alex Gittemeier    schedule 01.07.2013