2017-10-03 5 views
0

J'ai peu de problème avec le chevauchement de temps dans ProgressBar. J'ai une carte de liste. Lorsque vous cliquez sur cet élément, vous affichez l'activité avec le détail de l'affichage. La barre de progression de la carte affiche le compte à rebours de l'heure. Quand le temps est fini, compte à nouveau. Lorsque vous ajoutez la carte suivante et cliquez sur cette carte, affichez la carte précédente. Je ne sais pas pourquoi la nouvelle carte a le même temps que l'ancienne carte.Overlap of time IntentService

ProgressBarService.class

public class ProgressBarService extends IntentService { 

    private int interval; 
    public static final String KEY_EXTRA_PROGRESS = "progress"; 

    public ProgressBarService() { 
     super(ProgressBarService.class.getSimpleName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(ProgressBarService.KEY_EXTRA_PROGRESS); 

     if (intent != null) { 
      interval = intent.getIntExtra("interval", 0); 
      for (int i = interval; i >= 0; i--) { 
       broadcastIntent.putExtra("progress", i); 
       sendBroadcast(broadcastIntent); 
       SystemClock.sleep(1000); 

      } 
     } 
    } 
} 

CardDeatlisActitvty.class

public class CardDetailsActivity extends AppCompatActivity { 

    private Intent service; 
    private ResponseReceiver receiver = new ResponseReceiver(); 
    private ProgressBar progressBar; 
    private TextView secondTimeTextView; 
    private int interval; 

    public class ResponseReceiver extends BroadcastReceiver { 
     // on broadcast received 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Check action name. 
      if (intent.getAction().equals(ProgressBarService.KEY_EXTRA_PROGRESS)) { 
       int value = intent.getIntExtra("progress", 0); 
       new ShowProgressBarTask().execute(value); 
      } 
     } 
    } 

    class ShowProgressBarTask extends AsyncTask<Integer, Integer, Integer> { 

     @Override 
     protected Integer doInBackground(Integer... args) { 

      return args[0]; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      super.onPostExecute(result); 

      progressBar.setProgress(result); 
      secondTimeTextView.setText(" " + result + " "); 

      if (result == 0) { 
       service = new Intent(CardDetailsActivity.this, ProgressBarService.class); 
       service.putExtra("interval", interval); 
       startService(service); 
      } 

     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, 
       WindowManager.LayoutParams.FLAG_SECURE); 
     setContentView(R.layout.activity_card_details); 

     Bundle extras = getIntent().getExtras(); 
     if (extras != null) { 
      intervalTotpEncrypt = extras.getString("intervalTotp"); 
     } 

     interval = Integer.parseInt(intervalTotpDecrypt); 

     progressBar.setMax(interval); 
     progressBar.setProgress(interval); 

     service = new Intent(this, ProgressBarService.class); 
     service.putExtra("interval", interval); 
     startService(service); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     registerReceiver(receiver, new IntentFilter(
       ProgressBarService.KEY_EXTRA_PROGRESS)); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(receiver); 
    } 

} 

Répondre

0

Votre ProgressBarService ne sait pas que la "Carte" CardDetailsActivity a été changé. Si la boucle for (int i = interval; i >= 0; i--) {...} ne s'épuise pas et if (result == 0) { } n'est pas vrai alors il se comportera comme vous l'avez décrit car le compteur ProgressBarService compte toujours.

@Override 
protected void onPause() { 
    // notify ProgressBarService that the card will be changed (reset the counter) 
} 

esprit que lorsque vous appelez CardDetailsActivity pour la deuxième fois (carte suivante) onCreate() pourrait pas appeler.

+0

La meilleure solution dans ce cas est d'utiliser une autre solution sans utiliser InetntServics? –

+0

@Ewelina Maj Si le compteur n'a besoin de travailler que pour un seul 'Activity' d'une valeur à 0 alors je mettrais juste le compteur dans un thread dans cette' Activity'. Ça serait plus facile. Je peux bien sûr utiliser un «Service» occasionnel. – Kristopher