2017-05-22 2 views
0

Je ne suis pas bon dans les techniques Android, c'est pourquoi je poste une question.Comment communiquer efficacement avec le fil de l'interface utilisateur sous Android?

Le serveur distant envoie des photos à l'appareil Android via une connexion TCP à haute fréquence (jusqu'à 30 images par seconde). L'appareil Android doit récupérer les images et les afficher dans le conteneur ImageView (simulation de vidéo).

Cause La manipulation de l'interface utilisateur n'est autorisée qu'à partir du thread principal J'ai rencontré des problèmes de performances. Maintenant, l'opération de réception réseau s'exécute dans un seul thread, ce qui déplace les données vers le thread UI sur chaque image reçue selon docs.

j'ai eu deux idées pour une meilleure performance:

  1. sauter quelques photos (mises à jour de thread d'interface utilisateur lui-même et prend le nouveau cadre de certaines ressources partagées avec fil de réseau)
  2. D'une certaine façon OPTIMIZE processus de dessin (maintenant je simplement assigner un bitmap à l'ImageView)

En raison de la mauvaise expérience d'Android je ne peux pas déterminer si ces idées sont appréciées. Donc, toutes les suggestions sont les bienvenues. Thx.

+0

Peut-être un deuxième thread qui lit à partir d'une file d'attente ConcurrentLinkedQueue ou d'une autre file d'attente de thread sécurisé et publie les images interrogées dans votre vue? – JacksOnF1re

+0

@ JacksOnF1re ce pourrait être une bonne idée (je considérais la mise en œuvre propre de file d'attente thread-safe) et je vais tester ses performances. Mais je pense que le vrai jalon est dans la façon de dessiner l'image sur l'écran (maintenant je construis un bitmap à partir de données brutes jpeg/png/bmp et l'assigner à ImageView). – f4f

+0

Si vous avez le contrôle sur le serveur, je le streamerais en vidéo sur UDP. – nasch

Répondre

0

Je peux me tromper, mais je ne vois pas comment le multithreading va vous donner une meilleure performance (utile). Je vous suggère de réduire l'image ou d'encoder (dans la source), puis revenir - décoder (sur le récepteur). Un endroit où aller est ici: https://developer.android.com/topic/performance/network-xfer.html

Mais vous devez vous poser des questions sur les images, les tailles, si vous avez une grande image, vous en avez vraiment besoin? Vous n'en avez pas parlé, c'est important dans la plupart des cas. Ces paramètres comme la taille sont importants. Cet article peut vous aider si cela vous convient: https://developer.android.com/topic/performance/graphics/load-bitmap.html

+0

Une image sûre est codée sur le serveur et décodée sur le récepteur. Et je me rends compte que la taille de l'image est importante, mais la connexion LAN permet de transférer suffisamment de données pour 30 fps tandis que l'interface utilisateur ne peut pas afficher plus de 12-15 fps. Le multithreading est nécessaire, simplement parce que la connexion réseau ne peut pas être établie dans le thread principal (UI). – f4f