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();
	}