2012-04-05 6 views
3

Fondamentalement, j'ai un écran de démarrage qui montre quand l'utilisateur lance l'application. L'écran de démarrage est censé ouvrir un site Web (un site Web qui sera montré plus tard) pour télécharger toutes les polices et images à mettre en cache pour que tout fonctionne plus lisse la première fois que vous exécutez l'application. Mais tout ce que vous voyez est un écran blanc en ce moment, le code fonctionne (testé) mais il affiche un écran de démarrage blanc au lieu d'un avec un logo et du texte dessus.Écran de démarrage complètement blanc?

Voici le code;
Splash.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#4A4A4A"> 

    <ImageView 
     android:id="@+id/logo" 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" 
     android:src="@drawable/logo" 
     android:layout_gravity="center" /> 

    <TextView 
     android:text="@string/loading" 
     android:layout_gravity="center" 
     android:textColor="#FFA500" 
     android:textSize="15dp" 
     android:typeface="normal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <WebView 
     android:id="@+id/splashview" 
     android:layout_width="0px" 
     android:layout_height="0px" 
     android:layout_weight="0" /> 

</LinearLayout> 


Splash.java

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class Splash extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstance) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstance); 
     setContentView(R.layout.splash); 

     WebView webView = (WebView) findViewById(R.id.splashview); 
     webView.setWebChromeClient(new WebChromeClient()); 

     webView.loadUrl("http://ngmat.site90.net/matsedel/"); 

     webView.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       Intent NGMat = new Intent("android.intent.category.SECONDARY"); 
       startActivity(NGMat); 
      } 
     }); 

    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     finish(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setContentView(R.layout.main); 
    } 

} 

Répondre

0

Je pense que la ligne setContentView(R.layout.main) dans onResume pourrait être la cause du problème. Vous appelez déjà setContentView(R.layout.splash) en onCreate, vous n'avez donc plus besoin de l'appeler en onResume. Vous ne savez pas à quoi ressemble votre fichier main.xml, mais il semble qu'il s'agisse simplement d'une mise en page vierge.

+0

J'ai supprimé l'ensemble onResume et maintenant ça marche! Merci pour la réponse rapide. Mais maintenant, chaque fois que je lance l'application, il affiche l'écran de démarrage. Devrais-je faire un booléen pour vérifier si splash est déjà affiché? – Unidan

+0

L'enregistrement d'un booléen dans SharedPreferences est un moyen de le faire, mais comme @Colin l'a mentionné, vous ne savez pas nécessairement que vous avez mis en cache les bonnes données. Par exemple, si vous chargez l'application alors que ce site est en panne ou que vous n'avez pas de connexion, vous pouvez définir l'indicateur pour ne jamais afficher l'écran de démarrage même s'il n'a jamais mis en cache les données que vous vouliez. Pas sûr des détails de votre cas d'utilisation ici, mais je voulais juste mentionner certaines choses à considérer. – Aldryd

0

Peut-être que la page est chargée trop rapidement? Qu'en est-il de la minuterie à 3-5 secondes avant de commencer le chargement du contenu?

3

Je viens d'essayer opening your URL dans un navigateur de bureau normal et n'a absolument rien affiché pendant un certain temps, presque jusqu'à ce que tout ce qui devait être téléchargé a finalement été téléchargé. Il y a donc un problème de délai.

La vue Web est une étrange bête. Il me semble que vous lui donnez du HTML (ou dans votre cas une URL externe) et il revient presque immédiatement de l'appel de loadUrl. Ensuite, sur un autre thread, la vue Web détermine ce qu'elle veut afficher, puis la restitue. Par conséquent, il y a souvent un délai entre le retour de l'appel loadURL() et la mise à jour de l'écran. Dans mes applications, j'ai le HTML/CSS tout en une chaîne et donc il n'y a pas de retard de "téléchargement", et pourtant il peut y avoir un délai perceptible entre l'affichage de l'écran et le rendu de la vue web.

Et votre site semble avoir un délai de téléchargement pour ajouter au retard naturel de la vue Web. Je suspecte que la vue Web est rendue visible, elle n'a rien à afficher et rend donc un écran blanc/blanc, puis le téléchargement du HTML/quoi que ce soit du site externe, affichant toujours un écran vide jusqu'à ce qu'il ait tout est téléchargé et est prêt à afficher quelque chose sur l'écran, sauf que votre prochaine activité est invoquée via la méthode client onPageFinished() web view.

Le thread UI semble comprendre qu'une autre UI affectant le thread est en cours d'exécution (le début de l'activité suivante) et ne met donc pas réellement à jour l'écran sachant qu'il sera de toute façon écrasé. Ainsi, votre écran reste vide/blanc pendant que la nouvelle activité commence et termine sa séquence d'appels onCreate(), onStart(), etc. pour finalement mettre à jour l'écran.

Par conséquent, vous ne verrez jamais votre écran de démarrage. La vue Web n'a pas l'occasion de mettre à jour l'écran car l'activité suivante prend le contrôle de l'écran.

Malheureusement, je pense que votre approche est erronée. Je pense qu'il serait préférable de diviser l'approche en deux - charger l'écran de démarrage avec quelque chose de très simple, puis sur un thread d'arrière-plan provoquer le téléchargement des données à se produire. Avoir le thread d'arrière-plan invoquer l'activité secondaire quand il a tout terminé, idéalement en postant un appel au thread de l'interface utilisateur pour passer à l'activité suivante.

De cette façon, l'utilisateur verra quelque chose, puis en arrière-plan les autres choses se produiront pendant que l'utilisateur admire votre écran de démarrage.

Pourriez-vous intégrer le contenu de l'écran de démarrage dans le package téléchargé/installé de l'application afin qu'il s'affiche toujours rapidement sans être affecté par la présence d'une connexion de données ou sa vitesse? Souvent, les applications ont un simple écran de démarrage "gravé" dans le paquet installé de sorte qu'elles ont quelque chose à montrer indépendamment de la capacité de l'appareil à atteindre l'extérieur de lui-même.

+0

Salut. Merci d'avoir répondu! À l'heure actuelle, l'écran de démarrage est montré comme je veux et il met en cache le contenu Web, mais il y a 0,5 seconde d'écran blanc après l'éclaboussure, mais je peux vivre avec ça .. Maintenant, mon problème est que l'écran de démarrage est affiché à chaque fois l'application est ouverte même si le contenu a été mis en cache donc Im essayant de comprendre ce qu'il faut faire. Je pensais à 'SharedPreferences', j'ai besoin d'en lire un peu plus en premier. – Unidan

+0

L'application sait seulement que le contenu mis en cache est le bon contenu à utiliser une fois qu'il a suffisamment d'informations provenant du serveur Web externe pour se rendre compte qu'il a les données dont il a besoin. Vous savez que l'URL est une URL répétée et que le contenu n'a pas changé, mais pas le webview - il doit interagir avec votre serveur web externe pour comprendre cela, et cela pourrait prendre un peu de temps, surtout si le serveur ou le réseau de données (latence) est lent. – Colin