2

Peut-on exécutergestionnaire d'une classe non-activité

handler.postDelayed(runnable,400) 

d'une classe non Activity?

J'ai une classe de contrôleur, supposons que c'est un adaptateur. Pouvons-nous utiliser Handler là-bas?

J'ai essayé par débogage mon application avec des points de rupture, mais le contrôle ne parvient pas aux

handler.postDelayed(runnable,400) 

Quelqu'un peut-il me aider ce sujet?

Actuellement, j'utilise l'OCR. Si une certaine correspondance est faite, je veux revenir automatiquement à mon activité principale. Je suppose que c'est un looper. J'ai besoin de capturer la photo de celui-ci aussi. Pour cela, j'ai besoin d'utiliser un gestionnaire. Pouvons-nous exécuter handler.postDelayed(runnable, 400) à partir d'une classe non Activity?

+2

Bien sûr, vous pouvez utiliser 'handler' d'une classe de non-activité. Pourquoi supposeriez-vous le contraire?Un peu plus d'infos s'il vous plait. Où avez-vous créé le 'Handler'? Où le contrôle n'atteint-il pas? De même, 'postDelayed()' renvoie un booléen. Est-ce vrai ou faux? – bitbybit

Répondre

3

Oui, vous pouvez.

préférence Handler est associé à un Thread (pas un Activity ou un autre objet) et la file d'attente de message de Thread. Handlers post/processusMessages et Runnables à/de la file d'attente gérée par Looper.

Lorsque vous créez un Handler dans le thread principal (par exemple dans Activity classe) vous messages après/envoyer et Runnables (avec post(), postDelayed(), sendMessage() etc.) à la boucle de course. Toutefois, par défaut, les threads n'ont pas la boucle en cours sauf si vous en créez un avec l'appel à Looper.prepare() d'abord et Looper.loop() ensuite.

Dans le cas où un Handler créé sur un fil de fond est d'envoyer des messages et Runnables à la principale file d'attente de fil de chaque

  • passer le fil conducteur de Looper au constructor
  • de Handler
  • ou utiliser new Handler(Looper.getMainLooper()).

J'ai essayé de débogage mon application avec des points de rupture, mais le contrôle n'est pas une portée considérable.

Je suppose que soit votre logique de code n'a jamais atteint « le contrôle » ou handler est créé dans un thread d'arrière plan sans préparation et boucle Looper de sorte que la runnable ne peut pas être traitée par le handler.

0

J'ai utilisé la minuterie. Cela a fonctionné pour moi. LOL.

new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      Intent data = new Intent(); 
      data.putExtra(OcrCaptureActivity.TextBlockObject, textBlock.getValue()); 
      Log.d("Read Text : ", textBlock.getValue()); 
      Base.base_activity.setResult(CommonStatusCodes.SUCCESS, data); 
      Base.base_activity.finish(); 
     } 
    }, POST_DELAYED_TIME); 
+2

Vous devriez utiliser un gestionnaire comme cela a été suggéré par @Onik. C'est simple: '(nouveau gestionnaire (Looper.getMainLooper()) .postDelayed (nouveau MyRunnable(), delay);' En utilisant un TimerTask qui est juste un autre thread, vous ne pourrez pas mettre à jour l'interface si cela devient toujours une chose. – DataDino