2017-07-04 13 views
0

カウントダウンタイマーのサービスを作っています。アクティビティでは、毎秒ショータイム用のテキストビューを表示します:100 - 0です。私はタイマーが非常に速く走るのを見ます、しかし、私はこれをちょうど毎秒実行したいです。問題はどこですか?アクティビティに戻るとカウントダウンタイマーの実行が速くなる

MainActivity:

public static final String mBroadcastIntegerAction = "com.example.broadcast.integer"; 
private IntentFilter mIntentFilter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    showTime = (TextView) findViewById(R.id.textView1); 

    mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction(mBroadcastIntegerAction); 

    Intent serviceIntent = new Intent(this, AppServiceDay.class); 
    startService(serviceIntent); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    registerReceiver(mReceiver, mIntentFilter); 
} 

private BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(mBroadcastIntegerAction)) { 
      int second = intent.getIntExtra("Time", 0); 

      showTime.setText("" + second); 
     } 
    } 
}; 
    @Override 
protected void onPause() { 
    registerReceiver(mReceiver, mIntentFilter); 
//  unregisterReceiver(mReceiver); 
    super.onPause(); 
} 

サービス:

public class AppServiceDay extends Service { 

CountDownTimer cdt; 
public static Handler mHandler; 
int downer = 1000; 
int time = 100; 
int mainTime = 100000; 

@Override 
public void onCreate() { 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    cdt = new CountDownTimer(mainTime, downer) { 
     @Override 
     public void onTick(long millisUntilFinished) { 

      time -= 1; 

      Intent broadcastIntent = new Intent(); 
      broadcastIntent.setAction(MainActivity.mBroadcastIntegerAction); 
      broadcastIntent.putExtra("Time", time); 
      sendBroadcast(broadcastIntent); 
     } 

     @Override 
     public void onFinish() { 
      time = 100; 
      this.start(); 
     } 
    }; 
    cdt.start(); 

    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 
} 
+1

サービスでフィールド 'static int c = 0'を追加します。その後、 'onStartCommand'の中に' Log.d( "c"、 "" +(++ c));あなたは何が起こっているのかを把握する必要があります。 – Selvin

+0

1.カウントダウン専用のサービスを実行していますか? 1.フォアグラウンドでアプリケーションを実行していますか? 1がyes、2がnoの場合、HandlerとSharedPreferenceだけでこれを行うことができます。 –

+0

@Muthukrishnan Rajendran、サービスでハンドラを使用するとき、私はこのporoblemを与えます。もし私が活動タイマーに戻ってきたら、非常に速く働いてください。 – Fazel

答えて

0

onStartCommandが毎回STARTSERVICEが呼び出され、onStartCommandにあなたが新しいカウントダウンオブジェクトを作成している、

追加トリガされますヌルチャッチ新しいカウントダウンオブジェクトを作成する前に、複製タイマーを同時に実行するように修正します。

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    If(cdt == null) { 
     cdt = new CountDownTimer(mainTime, downer) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       time -= 1; 
       Intent broadcastIntent = new Intent(); 
       broadcastIntent.setAction(MainActivity.mBroadcastIntegerAction); 

       broadcastIntent.putExtra("Time", time); 
       sendBroadcast(broadcastIntent); 

      } 

      @Override 
      public void onFinish() { 
       time = 100; 
       this.start(); 
      } 
     }; 
     cdt.start(); 
    } 

    return super.onStartCommand(intent, flags, startId); 
} 
+0

私のコードの例を教えてもらえますか? – Fazel

+0

ありがとうございます。それは仕事です。 – Fazel

関連する問題