2016-02-02 2 views
0

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

Répondre

1

Si votre idée est de mettre à jour que l'interface utilisateur de l'activité et non d'effectuer des calculs lourds, accès au réseau, l'accès db, etc. Je vous recommande d'utiliser la méthode Handler.postDelayed(). Il va mettre en file d'attente un runnable sur le thread principal et dans ce runnable vous pouvez effectuer vos modifications de l'interface utilisateur.

De cette façon, vous n'aurez pas à créer un nouveau sujet et à le gérer vous-même. Comme pour toutes les questions concernant l'utilisation de la mémoire et les performances, il sera judicieux de mettre en œuvre les deux solutions et de profiler l'application. De cette façon, vous aurez une indication claire des ressources utilisées par les deux approches.

+0

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

+1

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. –

+0

oh droit n'y pensait pas. Je vais certainement essayer cela demain merci: D – nauti