Je veux programmer une petite application Android et je veux mettre à jour un élément sur mon activité après avoir appuyé sur un bouton très rapidement et souvent (tous les ~ 50-250 ms).La plupart du temps CPU avec Timer/ScheduledThreadPool pour changer d'élément très souvent
Je veux également être en mesure de mettre à jour la vitesse à quelle fréquence l'élément est changé pendant que la minuterie est en cours d'exécution.
Et donc j'utilise toujours "Executors.newSingleThreadScheduledExecutor()" pour créer un nouveau thread unique . Mais est-ce la meilleure solution concernant le CPU/RAM?
J'ai vraiment besoin de changer cet élément très souvent et je ne veux pas que l'appareil soit en retard.
Code actuel:
// OnCreate
mtimerTask = new Runnable() {
@Override
public void run() {
// set some variables
runOnUiThread(new Runnable() {
@Override
public void run() {
// update some things on the Activity
}
});
}
};
mscheduledPool = Executors.newScheduledThreadPool(1);
// onclickListener
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mscheduledPool.isShutdown() || firstExecute) {
// firstExecute necessary because isShutdown is always false at the beginning
firstExecute = false;
mscheduledPool.scheduleAtFixedRate(mtimerTask, 0, sleepTime, TimeUnit.MILLISECONDS); // sleepTime standard = 200
} else {
mscheduledPool.shutdownNow();
}
}
});
// triggered by buttons
private void updateSpeed(boolean increase) {
if (increase) {
someValue += 25;
sleepTime = Math.round((60 * 1000)/someValue);
if (!mscheduledPool.isShutdown()) {
mscheduledPool.shutdownNow();
mscheduledPool = Executors.newSingleThreadScheduledExecutor();
mscheduledPool.scheduleAtFixedRate(mtimerTask, 0, sleepTime, TimeUnit.MILLISECONDS);
}
}
else {
someValue -= 25;
sleepTime = Math.round((60 * 1000)/someValue);
if (!mscheduledPool.isShutdown()) {
mscheduledPool.shutdownNow();
mscheduledPool = Executors.newSingleThreadScheduledExecutor();
mscheduledPool.scheduleAtFixedRate(mtimerTask, 0, sleepTime, TimeUnit.MILLISECONDS);
}
}
}
en utilisant peut-être le "ScheduleFuture" retourné par "mscheduledPool.scheduleAtFixedRate" est plus resourcesparing?
Dans l'attente de vos réponses: D
Merci pour votre réponse, mais le Handler.postDelayed exécute un Runnable une seule fois et je veux qu'il s'exécute toutes les X secondes et je veux aussi pouvoir changer l'heure entre 2 exécutions (comme je le fais dans mon code avec newSingleThreadScheduledExecutor) – nauti
Vous pouvez y parvenir en appelant 'postDelayed()' à partir de votre runnable. De cette façon, vous aurez l'exécution récurrente et vous serez en mesure d'ajuster l'intervalle entre les mises à jour. –
oh droit n'y pensait pas. Je vais certainement essayer cela demain merci: D – nauti