2011-04-03 2 views
1

J'ai lu un fewposts sur le sujet,. Voici ma stratégie. J'ai une application de dessin qui montre les dessins créés par l'utilisateur dans un ListView. Une fois que l'utilisateur sélectionne un dessin, l'activité de DrawingEdit est tiré au, avec le dessin étant chargé dans onCreate, à peu près comme suit:Android: image clignotante à l'écran tandis que d'autres Voir le contenu est en cours de chargement

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set the layout for the activity 
setContentView(R.layout.drawing_view); 

    // do potentially expensive loading of drawing here 
    loadDrawing(); 
} 

loadDrawing() est en train de charger les formes individuelles de dessin de l'utilisateur à partir d'une base de données. Maintenant, pour 95% des dessins, et pour le cas d'utilisation «typique», cela fonctionne bien, car l'activité se charge rapidement avec peu ou pas de retard. Cependant, pour des dessins très très complexes, le délai peut aller jusqu'à deux secondes. Pour résoudre ce problème, j'ai essayé une asyncTask, qui fonctionne bien pour les 5% de dessins qui sont excessivement grands, mais pour l'autre 95% semble être trop lourde, et rend le chargement un peu plus lent en raison de devoir tirer jusqu'à l'asyncTask. Ce n'est pas la pire solution, mais je cherche des alternatives.

Maintenant, en plus des données de dessin que j'ai stockées dans la base de données, j'ai aussi une version PNG statique du dessin que je peux utiliser ... donc la solution que je voudrais utiliser est le long des lignes de:

  1. une charge d'affichage de l'écran « de démarrage » temporaire au début de onCreate(), en utilisant le dessin statique comme un espace réservé que l'utilisateur peut immédiatement examiner tandis que le dessin est en cours de chargement.
  2. Démarrer la routine parfois coûteuse loadDrawing().
  3. Une fois terminé, passez la vue et affichez la vue secondaire avec le canevas de dessin entièrement interactif qui inclut les formes de loadDrawing().

Mon problème est que si je modèle la solution ci-dessus à peu près comme ci-dessous, la mise en page « splash » est jamais affiché, et il est toujours le même délai jusqu'à ce que loadDrawing() soit terminé, puis la mise en page finale est affichée. Des informations sur ce qui se passe ici? Dois-je déplacer le loadDrawing() à onResume afin que l'interface utilisateur initiale de démarrage ait une chance de se charger avant que loadDrawing() ne soit déclenché?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // set the layout for the activity 
setContentView(R.layout.splash_view); 

    // do potentially expensive loading of drawing here 
    if (loadDrawing()) { 
     // set the layout for the activity 
    setContentView(R.layout.drawing_view); 
    } 
} 

Répondre

0

Si loadDrawing est une méthode dans votre activité, elle bloque le thread d'interface utilisateur jusqu'à ce qu'il soit terminé. En bref, l'interface utilisateur n'est pas affichée tant que les étapes de démarrage (créer/démarrer/reprendre) ne sont pas terminées. Cela n'a pas d'importance si vous mettez loadDrawing dans onResume, car cela bloquera toujours la création de l'interface utilisateur.

Vous devez utiliser une sorte de thread asynchrone en arrière-plan pour que cela fonctionne - c'est pourquoi AsyncTask est utile pour permettre à l'interface utilisateur d'être dessinée/manipulée alors que quelque chose d'autre doit arriver en même temps.

+0

Ah, ok, parfait, n'était pas sûr à 100% évidemment lorsque l'interface utilisateur a été dessinée, cela couvre, merci. –

+0

@Paul: Heureux d'aider, je dois admettre que cela m'a dérouté lors de la première fois avec les activités et le fil de l'interface utilisateur. – Squonk

Questions connexes