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);
}
}
La meilleure solution dans ce cas est d'utiliser une autre solution sans utiliser InetntServics? –
@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