IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Ouverture base de donnée dans une tache asynchrone


Sujet :

Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Ouverture base de donnée dans une tache asynchrone
    Bonjour,
    j'ai réalisé une tache de synchronisation au lancement de mon application entre une url avec du json et une base de donnée sqlite
    Au début j'ai testé simplement la synchro dans l'activité (SplashActivity) et maintenant j'aimerais le faire en tache asynchrone (obligé à partir d'Honeycomb)
    Mon problème : lorsque j'appelle la fonction : MixBdd.open() en asynchrone dans la fonction "doInBackground" il y a plantage (ligne 89) alors que ce n'est pas le cas si je le fais dans onCreate()


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    package com.myapp.gui.start;
     
    import java.io.File;
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import com.myapp.app.AppService;
    import com.myapp.app.MainApp;
    import com.myapp.gui.home.HomeActivity;
     
    import com.myapp.mix.Mix;
    import com.myapp.mix.MixBDD;
    import com.myapp.util.JSONParser;
     
    import android.app.Activity;
     
    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
     
    import android.os.AsyncTask;
    import android.os.Bundle;
     
    import android.view.View;
    import android.view.View.OnClickListener;
     
    import android.widget.ProgressBar;
    import android.widget.Toast;
     
    import com.myapp.R;
     
    public class SplashActivity extends Activity {
     
     
    	private ProgressBar mProgressBar;
     
    	private final static Logger logger = Logger.getLogger(SplashActivity.class
    			.getName());
    	public static AppService service;
     
    	/** Splash Screen **/
    	@Override
    	public void onCreate(Bundle icicle) {
    		super.onCreate(icicle);	      
    		setContentView(R.layout.main);
    		MainApp.log("ROCKS");
    		mProgressBar = (ProgressBar) findViewById(R.id.pBAsync);
    		MainApp.log( "Splash");
     
     
     
     
    		BigCalcul calcul=new BigCalcul();
    		calcul.execute();
    	}
     
    	private class BigCalcul extends AsyncTask<Void, Integer, Void>
    	{
     
     
     
    		@Override
    		protected void onPreExecute() {
    			super.onPreExecute();
    			Toast.makeText(getApplicationContext(), "Début du traitement asynchrone", Toast.LENGTH_LONG).show();
    			File dbFile = getDatabasePath("myapp.db");
    			dbFile.delete();//effacer BDD
     
    		}
     
    		@Override
    		protected void onProgressUpdate(Integer... values){
    			super.onProgressUpdate(values);
    			mProgressBar.setProgress(values[0]);
    		}
     
    		@Override
    		protected Void doInBackground(Void... arg0) {
     
    			 MixBDD MixBdd = new MixBDD(MainApp.context);//Création d'une instance de ma classe MixBDD
    			 MainApp.log( "Création instance classe BDD");
    			 MixBdd.open();//On ouvre la base de données pour écrire dedans !!!! PLANTE ICI
    			 MainApp.log( "Ouverture BDD fini");
     
    			// JSON Node names
    			final String TAG_MIXS = "mixes";
    			final String TAG_ID_MIX = "id";
    			final String TAG_DATE_MIX = "date";			
    			final String TAG_MP3_MIX = "mp3";
    			final String TAG_AUTHOR_MIX = "author_id";
     
    			  String url_mix = "http://lemyapp.com/modules/gabarit/android_actu/android.php";
    			  JSONArray mix = null;
    			  JSONParser jParser_mix = new JSONParser();
    			  JSONObject json_mix = jParser_mix.getJSONFromUrl(url_mix);
    			  MainApp.log( "Call "+url_mix);
    			  try {
    		            // Getting Array of Contacts
    		            mix = json_mix.getJSONArray(TAG_MIXS);
    		            // looping through All MIXES
    		            for(int i = 0; i < mix.length(); i++){
    		                JSONObject c = mix.getJSONObject(i);
    		                String id_mix = c.getString(TAG_ID_MIX);
     
    		                String date_mix = c.getString(TAG_DATE_MIX);
    		                String mp3_mix = c.getString(TAG_MP3_MIX);
    		                String author_mix = c.getString(TAG_AUTHOR_MIX);
     
    		                MainApp.log( "Splash mix mp3 => "+mp3_mix);
    		                MainApp.log( "Splash mix date => "+date_mix);
    		                MainApp.log( "Splash mix author => "+author_mix);
     
    		    	        Mix new_mix = new Mix(id_mix, date_mix,mp3_mix,author_mix); //Création d'un mix
    		    	     	MixBdd.insertMix(new_mix);//On insère le mix que l'on vient de créer
    		                publishProgress(i);		
    		            }
     
     
     
    			 } catch (JSONException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}	finally {
    				System.out.println("bye");
    			} // try-finally
     
     
    			return null;
    		}
     
    		@Override
    		protected void onPostExecute(Void result) {
    			Toast.makeText(getApplicationContext(), "Le traitement asynchrone est terminé", Toast.LENGTH_LONG).show();
    			Intent intent = new Intent(SplashActivity.this, HomeActivity.class);
    			startActivity(intent); 
    		}
     
    	}
     
     
    	public void onPause() {
    		try {
    			super.onPause();
    		} catch (Exception e) {
    			logger.log(Level.SEVERE, "", e);
    		}
    	}
     
    	public void onResume() {
    		super.onResume();
    	}
    }
    et voici ce qu'il y a dans la fonction open de la class MixBDD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public void open(){
    		//on ouvre la BDD en écriture
    		MainApp.log( "Ouverture maBaseSQLite");
    		bdd = maBaseSQLite.getWritableDatabase();
    	}

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par freaks Voir le message
    Bonjour,
    Bonjour !
    (obligé à partir d'Honeycomb)
    Non c'était déjà obligatoire avant, juste que le système ne s'assurait pas que c'était bien fait proprement.
    il y a plantage (ligne 89)
    Il faut le logcat !

    Il y a une règle en Java, tout code indépendant (Thread, Runnable), doit être entièrement protégé contre les exceptions. La raison étant qu'il *faut* que le code en question puisse avertir l'appelant que quelque chose s'est mal passé. Je pense que cette règle doit s'appliquer aussi à AsyncTask.doInBackground... Je ne comprends toujours pas pourquoi l'AsyncTask (de base) ne gère pas un joli "onError()" en plus des onPostExecute()....

    Donc... un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try {
     .....
    } catch (Exception ex) {
      Log.e("MyTask","Failed to sync database",ex);
    }
    Dans le doInBackground aiderait certainement à y voir plus clair.
    D'autant qu'il y a déjà un bloc try plus bas qui pourrait inclure ce code aussi...

    Eviter à tout prix les:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // TODO Auto-generated catch block
    				e.printStackTrace();
    			}	finally {
    				System.out.println("bye");
    e.printStackTrace() on ne sait jamais trop ce que ca fait...
    System.out.println() c'est pareil (adb n'est pas toujours là)

    Toujours préférer les Log.w() (si l'exception est 'attendue', genre IOException pendant une connexion réseau) ou Log.e() (si l'exception est 'inattendue').
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Bonjour Nicroman,
    merci de me répondre
    voici le logcat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    10-26 19:04:30.186: E/AndroidRuntime(13682): FATAL EXCEPTION: AsyncTask #1
    10-26 19:04:30.186: E/AndroidRuntime(13682): java.lang.RuntimeException: An error occured while executing doInBackground()
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at android.os.AsyncTask$3.done(AsyncTask.java:200)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.lang.Thread.run(Thread.java:1096)
    10-26 19:04:30.186: E/AndroidRuntime(13682): Caused by: java.lang.NullPointerException
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at com.myapp.mix.MixBDD.open(MixBDD.java:67)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at com.myapp.gui.start.SplashActivity$BigCalcul.doInBackground(SplashActivity.java:94)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at com.myapp.gui.start.SplashActivity$BigCalcul.doInBackground(SplashActivity.java:1)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at android.os.AsyncTask$2.call(AsyncTask.java:185)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    10-26 19:04:30.186: E/AndroidRuntime(13682): 	... 4 more
    en modifiant mon code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     try {
    				 MixBdd.open();//On ouvre la base de données pour écrire dedans
    			 } catch (Exception ex) {
    				 MainApp.log( "Failed to sync database : "+ex);
    			 }
    j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10-26 19:07:58.772: I/ (13790): Failed to sync database : java.lang.NullPointerException

  4. #4
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    Par défaut
    Protège ton code (il doit être blindé) avec des try.. catch et pas seulement dans le handler.

    A la moindre exception non "catchée" ton application plante et demandera un "Force close" à l'utilisateur, waw trop cool!

    Evite également les catch vide!
    Ca ne sert à rien car l'erreur ne sera jamais remontée et tu risques de chercher à perpette pour trouver un problème existant

    android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

    ça ressemble à un problème transactionnel (db lockée ailleurs ou manque de droits pour lire/écrire alors qu'elle est ouverte en lecture...).

    Perso, je gère les accès db par un singleton.
    Ca évite de faire des open/close à chaque accès db.
    Si la réponse vous a aidé, pensez à cliquer sur +1

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    tu as raison sur les try catch
    et j'ai trouvé l'erreur en fait ligne 87 il fallait mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MixBDD MixBdd = new MixBDD(getApplicationContext());
    Citation Envoyé par hotcryx Voir le message
    Protège ton code (il doit être blindé) avec des try.. catch et pas seulement dans le handler.

    A la moindre exception non "catchée" ton application plante et demandera un "Force close" à l'utilisateur, waw trop cool!

    Evite également les catch vide!
    Ca ne sert à rien car l'erreur ne sera jamais remontée et tu risques de chercher à perpette pour trouver un problème existant

    android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

    ça ressemble à un problème transactionnel (db lockée ailleurs ou manque de droits pour lire/écrire alors qu'elle est ouverte en lecture...).

    Perso, je gère les accès db par un singleton.
    Ca évite de faire des open/close à chaque accès db.

Discussions similaires

  1. ouvrir la connexion dans une base de données d'une maniére asynchrone
    Par ouadie99 dans le forum Accès aux données
    Réponses: 3
    Dernier message: 18/03/2008, 14h03
  2. Réponses: 14
    Dernier message: 02/07/2007, 09h30
  3. [OpenOffice][Base de données] [macro] connection a une base de données dans une macro
    Par Eruil dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 23/04/2007, 16h19
  4. [Conception] connexion de deux bases de données dans une page en php
    Par leclone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/04/2007, 14h59
  5. [VB.NET] lien d'une base de donnée dans une variable
    Par Anubis666 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/01/2006, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo