Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Splash Screen test connectivité internet

Sujet résolu
    7 août 2012 à 4:10:48

    Bonsoir,

    Mon nouveau problème ce soir est le suivant : Je souhaite afficher un splash screen au lancement de mon application. Pendant l'affichage du splashscreen, je souhaite effectuer différentes actions. Pour le moment le traitement en arrière plan se restreint à un test de la connectivité internet.

    Mes deux problèmes sont les suivants:
    - Si l'appareil n'est pas connecté à Internet, je souhaite lancer une AlertDialogue signalant à l'utilisateur qu'il devrait connecter son appareil. Le problème est que l'AlertDialog n'est pas bloquant, donc je la voit s'afficher une micro-seconde et mon splashscreen continu le lancement de l'application principale.

    - Lorsque j'arrive sur mon activité d'accueil après avoir chargé le splashscreen, si j'appui sur la touche retour, je reviens sur le splashscreen (ce que je voudrais empêcher).

    Voici le code de mon splash screen, si vous avez des conseils, je les attents avec impatience !
    public class LoaderActivity extends Activity 
    {
    	//creates a ViewSwitcher object, to switch between Views
    	private ViewSwitcher viewSwitcher;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
    		//Initialize a LoadViewTask object and call the execute() method
            new LoadViewTask().execute();
        }
        
        //To use the AsyncTask, it must be subclassed
        private class LoadViewTask extends AsyncTask<Void, Integer, Void>{
        	//A TextView object and a ProgressBar object
        	private TextView tv_progress;
        	private ProgressBar pb_progressBar;
        	
        	//Before running code in the separate thread
    		@Override
    		protected void onPreExecute() {
    			//Initialize the ViewSwitcher object
    	        viewSwitcher = new ViewSwitcher(LoaderActivity.this);
    	        /* Initialize the loading screen with data from the 'loadingscreen.xml' layout xml file. 
    	         * Add the initialized View to the viewSwitcher.*/
    			viewSwitcher.addView(ViewSwitcher.inflate(LoaderActivity.this, R.layout.loadingscreen, null));
    			
    			//Initialize the TextView and ProgressBar instances - IMPORTANT: call findViewById() from viewSwitcher.
    			tv_progress = (TextView) viewSwitcher.findViewById(R.id.tv_progress);
    			pb_progressBar = (ProgressBar) viewSwitcher.findViewById(R.id.pb_progressbar);
    			//Sets the maximum value of the progress bar to 100 			
    			pb_progressBar.setMax(100);
    			
    			//Set ViewSwitcher instance as the current View.
    			setContentView(viewSwitcher);
    		}
    
    		//The code to be executed in a background thread.
    		@Override
    		protected Void doInBackground(Void... params) {
    			//Get the current thread's token
    			synchronized (this) {
    				publishProgress(50);
    			    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    			    if ( cm.getActiveNetworkInfo() == null ) {
    			    	
    			    	runOnUiThread(new Runnable() {
    			    	    public void run() {
    			    	    	AlertDialog alertDialog = new AlertDialog.Builder(LoaderActivity.this).create();
    					        alertDialog.setTitle("Test réseau");
    					        alertDialog.setMessage("No internet");
    
    			    	   		alertDialog.setButton("Ok", new android.content.DialogInterface.OnClickListener() {
    								@Override
    								public void onClick(DialogInterface arg0,
    										int arg1) {
    									// TODO Auto-generated method stub
    									publishProgress(100);
    								}
    			    	   		});
    			    	   		
    			    	   		alertDialog.show();
    			    	    }
    			    	});
    			    }
    			}
    			return null;
    		}
    
    		//Update the TextView and the progress at progress bar
    		@Override
    		protected void onProgressUpdate(Integer... values) {
    			//Update the progress at the UI if progress value is smaller than 100
    			if(values[0] <= 100){
    				tv_progress.setText("Progress: " + Integer.toString(values[0]) + "%");
    				pb_progressBar.setProgress(values[0]);
    			}
    		}
    		
    		//After executing the code in the thread
    		@Override
    		protected void onPostExecute(Void result) {
    			 Intent mainIntent = new Intent(LoaderActivity.this, MenuActivity.class);
    			 startActivity(mainIntent);
    			
    		}
        }
        
        //Override the default back key behavior
        @Override
        public void onBackPressed() 
        {
        	//Emulate the progressDialog.setCancelable(false) behavior
        	//If the first view is being shown
        	if(viewSwitcher.getDisplayedChild() == 0){
        		//Do nothing
        		return;
        	}
        	else
        	{
        		//Finishes the current Activity
        		super.onBackPressed();
        	}
        }
    }
    


    Merci d'avance pour vos réponses !
    • Partager sur Facebook
    • Partager sur Twitter
      7 août 2012 à 18:20:38

      Bonsoir,

      Pour éviter de revenir à ton spashscreen, il suffit d'ajouter l'attribut android:noHistory="true" dans la balise <activity> du splashscreen de ton AndroidManifest.xml.

      PS: C'est la balise code Java qu'il faut utiliser, pas la C++! ;)
      • Partager sur Facebook
      • Partager sur Twitter
        7 août 2012 à 21:41:08

        Bonsoir,

        Selon moi, tu fais beaucoup trop de choses dans ta classe interne destinée à ton AsyncTask. Selon moi, tout le contenu de ta méthode protected void onPreExecute() devrait se trouver dans la méthode public void onCreate(Bundle savedInstanceState) et tu devrais tester si l'utilisateur a une connexion internet avant de lancer ton AsyncTask (donc toujours dans la méthode onCreate).

        Pour ta seconde question, voire Fumble. :)
        • Partager sur Facebook
        • Partager sur Twitter
        Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
          8 août 2012 à 2:25:21

          Parfait c'est exactement ce que je cherchais Fumble !!

          Pour ce qui est de la connexion internet, très bien disons que je vais la tester dans ma méthode onCreate.

          Je vais donc changer ma question en : Comment alerter l'utilisateur depuis mon Thread background, que quelque chose s'est bien/pas bien passé ? L'idée étant d'avoir un message d'alerte demandant une confirmation de l'utilisateur.

          Merci pour vos réponses !

          PS : Merci pour la précision Fumble je ne savais pas que c'était du Java en fait... :p Je viens de regarder de nouveau, je n'avais pas vu que la liste de "Code" était déroulante, et par défaut on s'arrête à D. Tu remarquera que j'ai quand même fait l'effort de choisir un langage Objet ! :-°
          • Partager sur Facebook
          • Partager sur Twitter
            8 août 2012 à 7:39:13

            De rien.

            Pour rejoindre les propos d'AndroiWiid, le fait que tu accède à l'UI Thread depuis la méthode doInBackground() casse tout le principe des AsyncTask. En effet, le but d'une AsyncTask est d'effectuer des calculs lourds en arrière plan de manière à ne pas bloquer l'interface utilisateur (qui elle est gérée dans l'UI Thread).
            Par exemple, j'ai une liste de 200 items pour lesquels je dois télécharger une mignature à chaque fois: rien n'empêche l'utilisateur de cliquer sur l'image ou de lancer la page d'options via le bouton menu alors que toutes les images n'ont pas été téléchargée.

            De plus, comme son nom l'indique, une AsyncTask étant asynchrone, tu ne peux pas savoir quand elle aura été exécutée en entier. C'est pour cela qu'il faut que tu enlèves ton runOnUiThread(new Runnable(){/*blabla*/}); de ton AsyncTask et que tu gardes en tête que détecter la présence ou non de connectivité n'est pas une tâche lourde.

            En gros, cela donnerait:
            Si pas de connexion alors
                 Monter l'AlertDialog
                 Fermer l'application lors du clic sur la boite de dialogue (ou faire autre chose)
            Sinon
                 Lancer l'AsyncTask
            Fin si

            Pour forcer le clic sur un bouton sur la boite de dialogue: myDialog.setCancelable(false);
            • Partager sur Facebook
            • Partager sur Twitter
              9 août 2012 à 4:24:25

              Le problème étant que pour le moment je souhaitais juste faire mon test de connexion internet. Je reviendrai surement vers vous sur ce point qui reste encore un peu bizard dans ma tête ! Il va donc me falloir développer ma tâche LOURDE, qui consiste a parser un flux RSS et à le placer en mémoire ou BDD.

              Merci

              A bientôt
              • Partager sur Facebook
              • Partager sur Twitter

              [Android] Splash Screen test connectivité internet

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown