2016-04-15 21 views
1

私はアンドロイドを使用しています。 最近、私は再送データをコーディングしています。 が発生しましたが、不正な状態例外が発生しました。タイマーがキャンセルされました。タイマーはキャンセルされたエラーをどのように処理できますか?

これは私のlogcatです:

java.lang.RuntimeException: Unable to start receiver kr.co.iosystem.blackeyeonandroid.util.NetworkChangeReceiver: java.lang.IllegalStateException: Timer was canceled 
                at android.app.ActivityThread.handleReceiver(ActivityThread.java:2414) 
                at android.app.ActivityThread.access$1700(ActivityThread.java:135) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:136) 
                at android.app.ActivityThread.main(ActivityThread.java:5001) 
                at java.lang.reflect.Method.invokeNative(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:515) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
                at dalvik.system.NativeStart.main(Native Method) 
                Caused by: java.lang.IllegalStateException: Timer was canceled 
                at java.util.Timer.scheduleImpl(Timer.java:561) 
                at java.util.Timer.schedule(Timer.java:459) 
                at kr.co.iosystem.blackeyeonandroid.sender.DataSender.sendPicData(DataSender.java:251) 
                at kr.co.iosystem.blackeyeonandroid.sender.DataSender.restart(DataSender.java:425) 
                at kr.co.iosystem.blackeyeonandroid.sender.DataSender.update(DataSender.java:337) 
                at java.util.Observable.notifyObservers(Observable.java:138) 
                at kr.co.iosystem.blackeyeonandroid.util.AutoObservable.notifyObservers(AutoObservable.java:13) 
                at kr.co.iosystem.blackeyeonandroid.main.Agency.notifyMessage(Agency.java:88) 
                at kr.co.iosystem.blackeyeonandroid.util.NetworkChangeReceiver.onReceive(NetworkChangeReceiver.java:200) 
                at android.app.ActivityThread.handleReceiver(ActivityThread.java:2407) 
                at android.app.ActivityThread.access$1700(ActivityThread.java:135)  
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)  
                at android.os.Handler.dispatchMessage(Handler.java:102)  
                at android.os.Looper.loop(Looper.java:136)  
                at android.app.ActivityThread.main(ActivityThread.java:5001)  
                at java.lang.reflect.Method.invokeNative(Native Method)  
                at java.lang.reflect.Method.invoke(Method.java:515)  

私は、これは例外が

private Timer mTimer = null; //global variable 

@Override 
public void run() { 
mTimer = new Timer(); 
... 
} 
@Override 
public void update(){ 
if (this.senderState == SenderState.STOPPED) { 
      this.mTimer.cancel(); 
    this.restart(); //Timer exception ... 
     } 

を発生している部分は私が間違っているつもりです場所を知ることができていると思いますか?

+0

キャンセルされたタイマーを再起動することはできません。あなたは新しいものを作る必要があります。 –

+0

@GabeSechanあなたのアドバイスはキャンセルを使用しないで、同じ方法で再起動しますか? –

+0

DataSenderオブジェクトでrestartを使用できます。しかし、同じものを開始するだけではなく、新しいTimerオブジェクトを作成する必要があります。 –

答えて

1

私は個人的にはjava.util.Timerクラスを使用したくありません。これは主に、cancel()に再起動できないためです。

通常はjavax.swing.Timerを使用しますが、アンドロイドでは使用できないと思います。 Androidでは、android.os.Handlerクラスをカプセル化する独自のタイマークラスを作成する必要があると思います。

これは、あなたがそれを行うだろうかです:

HandlerクラスがpostDelayedと呼ばれるメソッドが含まれています。それは遅れてRunnableを実行します。

1000ミリ秒ごとに実行されるタイマーを作成する場合は、ハンドラを作成してpostDelayed(someRunnable, 1000)を呼び出します。

ここに興味深い部分があります。上記のsomeRunnableでもとなります。好きなように実行した後にpostDelayedと呼んでください。このようにして、「ループ」が形成される。

"ハンドラを停止するにはどうすればよいですか?開始後に間隔を変更するにはどうすればよいですか?"あなたは尋ねました。

タイマークラスに一時停止メソッドを追加するには、pausedというフィールドを作成し、その値を確認してから、実行可能ファイルにpostDelayedを呼び出します。 pausedの値を設定して取得するセッターとゲッターを追加できます。

タイマーの開始間隔を変更するには、intervalという別のフィールドを作成して同様の方法で実装します。

TL; DR

私は非常にいいです、yaは知っています。

import android.os.Handler; 

public class Timer { 
    private Handler handler; 
    private boolean paused; 

    private int interval; 

    private Runnable task = new Runnable() { 
     @Override 
     public void run() { 
      if (!paused) { 
       Timer.this.runnable.run(); 
       Timer.this.handler.postDelayed (this, interval); 
      } 
     } 
    }; 

    private Runnable runnable; 

    public int getInterval() { 
     return interval; 
    } 

    public void setInterval(int interval) { 
     this.interval = interval; 
    } 

    public void startTimer() { 
     paused = false; 
     handler.postDelayed (task, interval); 
    } 

    public void stopTimer() { 
     paused = true; 
    } 

    public Timer (Runnable runnable, int interval, boolean started) { 
     handler = new Handler(); 
     this.runnable = runnable; 
     this.interval = interval; 
     if (started) 
      startTimer(); 
    } 
} 
関連する問題