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 :

plusieurs asyntask en meme temps


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut plusieurs asyntask en meme temps
    bonjour,

    en faite dans mon activité j'ai 3 boutton et quand j'appuie un bouton je demarre une tache grace à asyntask.

    j'ai pas besoin que les tache fonctionne simultanément mais quand j'appuis sur un bouton je veux lancer une nouvelle tache.

    le probleme que j'ai c'est quand j'appuie plusieurs fois sur les boutons ,aprés y'a rien qui s'execute.
    est ce qu'il y'a des restrictions sur le nombre de thread .
    j'obtient aucune exception mais je crois que les taches se mettent en atente , mais les instructions que j'ai mit dans l'asyntask ne prennent pas beaucoup de temps cependant je ne comprends pas pourqoui les tache reste encore ouverte.

  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
    Oui... comme tout bon task-manager, les AsyncTask sont effectuées par des worker-threads (ce qui évite la création très longue de thread, leur démarrage, etc...) qui sont au nombre de 3 si ma mémoire est bonne (mais ce peut être dépendant du système).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    merci nicroman .

    mais moi je dois pouvoir executer la tache quand j'appuie sur le bouton, je crois il me faut que je tue le thread qui execute la tache .

  4. #4
    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
    Il suffit d'appeler cancel() sur l'asynctask qui tourne.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    merci nicroman.
    j'ai du code à executer dans le onPostExecute et j'ai des variables de asyntask qui sont dans le onPostExecute et je dois pas tuer le thread dans le asyntask mais dans le onPostExecute.
    est ce qu'il ya une solution de le faire dans le onPostExecute.

  6. #6
    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
    1. Il ne faut pas tuer un worker-thread au risque de ne plus jamais pouvoir lancer d'asynctask. D'ailleurs, je ne crois pas que l'on ai accès à celui-ci.

    2. Je pense qu'il y a un soucis de conception, avec un peu de code on pourrait peut-être démêler le truc.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    un grand merci nicroman.
    bon je vais essayer de bien expliquer le code comme ça vous perdez pas beucoup de temps.
    on faite mon programme doit pouvoir telechatger des fichier pdf depuis un serveur ftp.

    j'ai deux activité :
    document: qui permet de faire les operations de telechargements qui contient la classe interne asyntask.

    l'actuvity choix_gare qui reçoit une liste de ville depuis l'activity document , elle demande à l'utilisateur de choisir une ville , puis elle renvoie le string choisie.

    bon les fichiers dans le serveurs sont nommés de cette façon:

    numero_date_ville_type:
    l'actyvité document reçoit le num_date et le type depuis une autre activité.
    on va prendre l'exemple du 3 eme boutons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new connexion().execute(i.getStringExtra("num_date"), "VBR");
    là je demande à cette classe interne de telecharger un fichier avec comme nom:
    "num_date_ville_VBR"

    dans cette classe asyntask je cherche tous les fichier qui corespondent au critere de recherche, et si je trouve qu'il ya plusieurs fivhiers qui ont des villes diferentes je demande à l'utilisateur de choisir une ville.

    bon voila le code j'ai supprimé la moitié du code , j'ai essayé de mettre l'essentiel:
    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
    public class document extends Activity {
    	private ArrayList<String> cahine_save;
    @Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		// TODO Auto-generated method stub
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode==RESULT_OK)
     
    		       for(int i=0;i<cahine_save.size();i++){
     
    		    		   try {
     
    		    		     new connexion().execute(cahine_save.get(i).toString());
    		    		   }catch(Exception e){
    		    			   Log.i("here i am ", e.getMessage());
     
    		    		   }
    		   	 }
    		  }
    	}
     
    class connexion extends AsyncTask<String, String, String> {
    		private FTPClient mFTPClient;
    		private ArrayList<String> tab_chaine;
    		private HashSet<String> tab_ville;
    		private int requestCode=1;
    		private Iterator<String> it;
     
    		@Override
    		protected void onPostExecute(String result) {
    			// TODO Auto-generated method stub
    			super.onPostExecute(result);
    			//ici je demande a l'utilisateur de choisir une ville 
    			if (result.equals("OK")){
    				document.this.cahine_save = new ArrayList<String>();
    				document.this.cahine_save = tab_chaine;
    					Intent intent_name = new Intent();
    					intent_name.setClass(getApplicationContext(), choix_gare.class);
    					Bundle b = new Bundle();
    		            b.putSerializable("lesvilles", tab_ville);
    		            intent_name.putExtras(b);
    		            startActivityForResult(intent_name, 1);
    		   }
    	}
     
    		@Override
    		protected String doInBackground(String... params) {
    			boolean retour; 
     
    			retour= ftpConnect("site", "user",
    								"password", 999, params[0], params[0]);
    			 return "NO";	
    	}
     
    		public boolean ftpConnect(String host, String username,
    				String password, int port, String chaine, String type)   {
    			try {
     
    				 mFTPClient = new FTPClient();
    			  try {
     
    					mFTPClient.connect(host, 21);
    					if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
     
    						boolean status = mFTPClient.login(username, password);
    						mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
    						mFTPClient.enterLocalPassiveMode();
    					    if (port == 999){
    							boolean sta=ftpDownload("/fromCIS/"+chaine,Environment.getExternalStorageDirectory()+
    									"/Fromcis/"+chaine);
    							File file = new File("/sdcard"+
    									"/Fromcis/"+chaine);
     
    							Uri path = Uri.fromFile(file); 
    					    	Intent intent = new Intent(Intent.ACTION_VIEW);
    		                    intent.setDataAndType(path, "application/pdf");
    		                     // optionnel a toi de voir quel flag tu souhaites
    		                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    		               //     new ToastMessageTask().execute("on a demandé une nouvelle fenetre adobe reader"); 
    		                    try {
    		                        startActivity(intent);
    		                        Log.i("adobe ","on a demandé d'aaficher le document " );
    		                    } 
    		                    catch (ActivityNotFoundException e) {
    		                        Log.e("intent dobe ", e.getMessage());
     
    		                    }
     
     
    							return false;
    						}
    							return false;
    					}
    						}catch(Exception e){
    							new ToastMessageTask()
    							.execute("on a un probleme  "+e.getMessage()); 
    						}
    			        }
     
     
                return false;
    		}
    je trouve que c'est dificile de comprendre mon programme :

    voile un exemple simple de ce que je veux faire:
    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
     
     
     
      jappele la classe asyntask si j'appuie sur un bouton
      new connexion().execute(chaine a telecharge);
     
     
     
     
    class connexion extends AsyncTask<String, String, String> {
     
     
    		@Override
    		protected void onPostExecute(String result) {
    			// TODO Auto-generated method stub
    			super.onPostExecute(result);
     
    	}
     
    		@Override
    		protected String doInBackground(String... params) {
    			boolean retour; 
     
    			retour= ftpConnect("site", "user",
    								"password", 999, params[0]);
    			 return retour;	
    	    }
           //methode local qui permet de faire le telechargement du fichier 
    		public boolean ftpConnect(String host, String username,
    				String password, int port, String chaine)   {
     
    	           boolean sta=ftpDownload("/fromCIS/"+chaine,Environment.getExternalStorageDirectory()+
    									"/Fromcis/"+chaine);
     
    	           return sta;
     
    			}  
    	}
    dans quel endroit dans le code je tue le thread , est ce que dans l'activity englobante ou dans dans l'asyntask.

    je cherche a resoudre ce probleme parceque si j'apuie plusieurs fois sur le bouton il repond plus , il execute pas le code, moi j'ai cru que c'est a cause des thread qui ont eté lancé et il sont encore en execution , j'ai essayé de faire le debuggin et effectivement les thread sont en mode running . et je veux tuer a chaque fois le asyntask pour liberer la place .

  8. #8
    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
    Il faut juste stocker l'async-task et tuer une tâche existante avant de la démarrer...

    [/code]if (mDownloadTask != null)
    mDownloadTask.cancel(true);
    mDownloadTask = new Connexion();
    mDownloadTask.execute(....);[/code]

    Et d'ailleurs, dans le onPause() (ou onDestroy au choix) tuer l'async-task ne mange pas de pain....

    Haa oui... et ne pas oublier dans le onPostExecute de l'AsyncTask de tout de suite faire un "mDownloadTask=null;"
    (pas besoin de synchronisation les fonctions sont dans les thread UI donc ne risquent pas de se téléscoper).

    Mais je crois que j'ai pas bien compris les étapes des données....

    Etape 1: L'utilisateur choisis une "ville" => au choix de la ville démarrage async-task... dans le onPostExecute, appel de l'activité "Gare" (etape 2)....
    Interruption de l'async-task si l'utilisateur choisi une autre ville, ou quitte l'activité.
    C'est bien ca ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    meci nicroman.
    voila ça fait presque 3 jours que j'essai et je n'arrive pas.
    et j'avait déja essayé de créer une variable qui tient asyntask et puis quand je lance une nouvelle tache je la tue puis je creé une nouvelle instance, le meme probleme aprés plusieurs clic j'ai plus d'execution , bon le probleme je suis sur c'est les tache que j'execute.

    je vais mettre tout mon code comme ça vous aurez une bonne idée de ceque je fais.

    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
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    package com.example.driver_final;
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.SocketException;
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Iterator;
     
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    import org.apache.commons.net.io.CopyStreamAdapter;
     
     
    import android.app.ActionBar;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.ActivityNotFoundException;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
     
    import com.example.driver_final.R.id;
    import com.example.driver_final.document.connexion;
     
    public class document extends Activity {
    	private ActionBar actionBar;
    	private Button bt2;
    	private Button bt1;
    	private Button bt3;
    	private ArrayList<String> cahine_save;
    	protected connexion con;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.type_document);
    		actionBar = getActionBar();
    		actionBar.setTitle("driver");
    		actionBar.setSubtitle(R.string.title2);
    		bt1 = (Button) findViewById(id.buon1);
    		bt2 = (Button) findViewById(id.buon2);
    		bt3 = (Button) findViewById(id.buon3);
    		final Intent i = getIntent();
    		bt1.setOnClickListener(new OnClickListener() {
     
    			@Override
    			public void onClick(View v) {
    				Toast.makeText(
    						getBaseContext(),
    						"voile la chaine generé "
    								+ i.getStringExtra("num_date"),
    						Toast.LENGTH_LONG).show();
    				if (con != null)
    					con.cancel(true);
    				con = new connexion();
    				con.execute(i.getStringExtra("num_date"), "REBU");
     
    	}
    		});
     
    		bt2.setOnClickListener(new OnClickListener() {
     
    			@Override
    			public void onClick(View v) {
    				Toast.makeText(
    						getBaseContext(),
    						"voile la chaine generé "
    								+ i.getStringExtra("num_date"),
    						Toast.LENGTH_LONG).show();
    			 if (con != null)
    					con.cancel(true);
    				con = new connexion();
    				con.execute(i.getStringExtra("num_date"), "LYST"); 
     
    			}
    		});
     
    		bt3.setOnClickListener(new OnClickListener() {
               @Override
    			public void onClick(View v) {
    				Toast.makeText(
    						getBaseContext(),
    						"voile la chaine generé "
    								+ i.getStringExtra("num_date"),
    						Toast.LENGTH_LONG).show();
     
    				if (con != null)
    					con.cancel(true);
    				con = new connexion();
    				con.execute(i.getStringExtra("num_date"), "VBR");
     
    			}
    		});
     
    	}
     
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		// TODO Auto-generated method stub
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode==RESULT_OK)
    			   Toast.makeText(getBaseContext(), data.getExtras().getString("ville"), Toast.LENGTH_LONG).show();
    		       for(int i=0;i<cahine_save.size();i++){
    		    	   if(cahine_save.get(i).contains(data.getExtras().getString("ville"))){
    		    		 try {
    		    			   Log.i("voila le path du fichier a telecharger", cahine_save.get(i).toString());
    		    			 if (con != null)
    		   					con.cancel(true);
    		   				 con = new connexion(); 
    		    			 con.execute(cahine_save.get(i).toString());
    		    		   }catch(Exception e){
    		    			   Log.i("here i am ", e.getMessage());
     
    		    		   }
     
     
    		    	   }
     
    		       }
    	}
     
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.second, menu);
    		return true;
    	}
     
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		switch (item.getItemId()) {
    		case R.id.action_back:
    			finish();
    		}
     
    		return true;
    	}
     
    	class connexion extends AsyncTask<String, String, String> {
    		private FTPClient mFTPClient;
    		private ArrayList<String> tab_chaine;
    		private HashSet<String> tab_ville;
    		private int requestCode=1;
    		private Iterator<String> it;
     
    		@Override
    		protected void onCancelled() {
    			// TODO Auto-generated method stub
    			super.onCancelled();
    			new ToastMessageTask().execute("voila on va quitter le thread ");
    		}
     
    		@Override
    		protected void onPostExecute(String result) {
    			// TODO Auto-generated method stub
    			super.onPostExecute(result);
    			//Toast.makeText(getApplicationContext(), result, 1).show();
    			if (result.equals("OK")){
    				document.this.cahine_save = new ArrayList<String>();
    				document.this.cahine_save = tab_chaine;
    					Intent intent_name = new Intent();
    					intent_name.setClass(getApplicationContext(), choix_gare.class);
    					Bundle b = new Bundle();
    		            b.putSerializable("lesvilles", tab_ville);
    		            intent_name.putExtras(b);
    		            startActivityForResult(intent_name, 1);
    		      }
    			con=null;
    			//con.cancel(true);
     
     
    	}
     
    		@Override
    		protected String doInBackground(String... params) {
    			boolean retour; 
    		if (params.length==1){
    			Log.i("voila la chaine a telecharge ",params[0]);	
    			retour= ftpConnect("site", "user",
    								"password", 999, params[0], params[0]);
    			 return "NO";	
    			}
    			else{
    				Log.i("voila la chaine et la date ",params[0]);	
    					retour= ftpConnect("site", "user","password", 21, params[0], params[1]);
    					if( retour==true)
    						return "OK";
    					else
    						return "NO";
    				}
     
    		}
     
    		public boolean ftpConnect(String host, String username,
    				String password, int port, String achaine, String type)   {
    			try {
    				Log.i("on doit telecharger ce fichier", chaine);
     
    				 mFTPClient = new FTPClient();
    			  try {
     
    					mFTPClient.connect(host, 21);
    					if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
     
    						boolean status = mFTPClient.login(username, password);
    						mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
    						mFTPClient.enterLocalPassiveMode();
    					    if (port == 999){
    							boolean sta=ftpDownload("/fromCIS/"+chaine,Environment.getExternalStorageDirectory()+
    									"/Fromcis/"+chaine);
    							File file = new File("/sdcard"+
    									"/Fromcis/"+chaine);
    					    return false;
    						}
     
    						FTPFile[] files = mFTPClient.listFiles("/fromCIS");
    						tab_chaine = new ArrayList<String>();
    					    tab_ville = new HashSet<String>();
    						for (FTPFile file : files) {
    							if (ressemble(file.getName(), chaine, type) == true) {
    								tab_chaine.add(file.getName());
    								String ville=  extraire_ville(file.getName(),type);
    							    tab_ville.add(ville);
     
    					       }
    					   }
    					   try {
    							it = tab_ville.iterator();
    							new ToastMessageTask().execute("voila le nombre de ville"+tab_ville.size());
    							if (tab_ville.size()==0)
    							{
    								new ToastMessageTask().execute("NO");
    								return false;
    							}
     
     
    							if (tab_ville.size()>1)
    								return true;
     
    							else {
     
    								try{
    									Intent intent = new Intent(Intent.ACTION_VIEW);
    									for(int i=0;i<tab_chaine.size();i++){
    										File file = new File("/sdcard"+
    												"/Fromcis/"+tab_chaine.get(i));
    										new ToastMessageTask().execute("on a demandé de telecharger ce path"+tab_chaine.get(i)); 
    										Log.i("on a demandé de telecharger ce path", tab_chaine.get(i));
    										status =ftpDownload("/fromCIS/"+tab_chaine.get(i),Environment.getExternalStorageDirectory()+
    												"/Fromcis/"+tab_chaine.get(i));
     
    										    	Uri path = Uri.fromFile(file); 
    										    	intent.setDataAndType(path, "application/pdf");
    							                     // optionnel a toi de voir quel flag tu souhaites
    							                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    							                    //new ToastMessageTask().execute("on a demandé une nouvelle fenetre adobe reader"); 
    							                    try {
    							                        startActivity(intent);
    							                        Log.i("adobe ","on a demandé d'aaficher le document " );
    							                    } 
    							                    catch (ActivityNotFoundException e) {
    							                        Log.e("intentdobe ", e.getMessage());
     
    							                    }
     
    									}
    								}catch(Exception e){
    									new ToastMessageTask().execute(e.getMessage());
     
    								}
     
     
    								return false;
    								}
    						}catch(Exception e){
    							new ToastMessageTask()
    							.execute("on a un probleme  "+e.getMessage()); 
    						}
    			        }
    					else 
    					{
    						new ToastMessageTask().execute("on a pas pu se connecter au serveur");
    					}
    				} catch (Exception e) {
    					Log.e(username, e.getMessage());
    				}
     
    			} catch (Exception e) {
    				Log.e(username, e.getMessage());
    			}
                return false;
    		}
     
    		private String extraire_ville(String nom_fichier, String type) {
    			String[] tabl;
    			String ville;
    			if (type.equals("LYST") || (type.equals("REBU"))) {
    				tabl = new String[4];
    				tabl = nom_fichier.split("_");
    				 ville = tabl[2];
    				return ville;
    			} else
    		    {
    				tabl = new String[5];
    				tabl = nom_fichier.split("_");
    				ville = tabl[2];
    				return ville;
    			}
    	}
    		/**
                     * mFTPClient: FTP client connection object (see FTP connection example)
                     * srcFilePath: path to the source file in FTP server desFilePath: path
                     * to the destination file to be saved in sdcard
                     */
    		public boolean ftpDownload(String srcFilePath, String desFilePath) {
    			boolean status = false;
    			try {
    				FileOutputStream desFileStream = new FileOutputStream(
    						desFilePath);
    				;
    				status = mFTPClient.retrieveFile(srcFilePath, desFileStream);
    				desFileStream.close();
     
    				 return status;
    			} catch (Exception e) {
    				Log.d(e.getCause() + "", "download failed");
    			}
     
    			return status;
    		}
     
    		private class ToastMessageTask extends
    				AsyncTask<String, String, String> {
    			String toastMessage;
     
    			@Override
    			protected String doInBackground(String... params) {
    				toastMessage = params[0];
    				return toastMessage;
    			}
     
    			protected void OnProgressUpdate(String... values) {
    				super.onProgressUpdate(values);
    			}
     
    			// This is executed in the context of the main GUI thread
    			protected void onPostExecute(String result) {
    				if (result.equals("NO"))   {
     
    					AlertDialog.Builder adb = new AlertDialog.Builder(document.this);
    	        		adb.setTitle("info");
    	        		adb.setMessage("Aucun document trouvé pour cette  date et ce numero");
    	        		adb.setPositiveButton("Ok",null);
    	        		adb.setIcon(R.drawable.info);
    	        		adb.show();
    				}
    				Toast toast = Toast.makeText(getApplicationContext(), result,
    						Toast.LENGTH_LONG);
    				toast.show();
    		   }
    	  }
    		public boolean ressemble(String nom_fichier, String chaine, String type) {
    			if ((nom_fichier.contains(chaine)) && (nom_fichier.contains(type))) {
    							return true;
    			}
    			return false;
    		}
    	}
    }

    comme j'ai dit dans le post avant j'ai 3 activité :
    la premiere main : l'utilisateur tape un numero et une date , je crée une variable numdate et je l'envoie à la deuxieme activité qui est document.

    comme les fichiers dans le serveur ftp sont nommés de cette façon :
    numero_date_ville_type:

    il me faut encore le nom de la ville et le type du fichier .

    pour avoir le type j'ai mis 3 boutons dans l'activité document qui sont nommé :

    REBU
    LYST
    VBR

    si l'utilisateur tape sur le premier bouton je dois telecharger le fichier avec comme nom num_date_ville_REBU et ainsi de suite.

    avec num_date qu'on a pu avoir depuis l'activité main,le type qu'on sait d'aprés le nom du bouton, ce qui reste c'est la ville,et pour ça je demande d'executer une asyntask pour me connecter au serveur et avoir tout les fichiers qui ont les mêmes critere . càd le meme numdate ,et le même type.

    dans le doInBackground j'ai 2 différente operations:
    la premiere qui est lancé depuis le onActivityResult.
    la deuxieme qui est executé depuis les clic sur les boutons , lorsqu'on veut la liste des villes trouvés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    else{
    				Log.i("voila la chaine et la date ",params[0]+params[1]);	
    					retour= ftpConnect("rita.blogistics.be", "blogisticstest",
    							"bLog-IExp!", 21, params[0], params[1]);
    					if( retour==true)
    						return "OK";
    					else
    						return "NO";
    				}
    dans ma recherche dans le serveur j'aurais besoin de deux parametre
    param[0] qui corespond au numero et date et param[1] qui corespond au type de fichier.
    dans la premiere execution de doInBackground c'est ce bout de code qui s'execute dans la methode ftpConnect

    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
    //liste des noms des fichiers dans le serveur ftp
    						FTPFile[] files = mFTPClient.listFiles("/fromCIS");
                            //liste de chaine qui corespondent au criters de recherche ça veut dire le type le num et la date
    						tab_chaine = new ArrayList<String>();
    						/*set de ville qu'ona trouvé dans ces chaines on aura besoin de cet liste pour donner à l'utilisateur la possiblilité 
    						de choisir quelle ville cad quelle fichier*/
    						tab_ville = new HashSet<String>();
    						//ici je fais une boucle sur le tableau de fichier et je cherche si un fichier corespond à ce que je cherche
    						//si le fichier corespond au critere alors je meme sont nom dans l'arraylist et je met sa ville dans le set
    						for (FTPFile file : files) {
    							if (ressemble(file.getName(), chaine, type) == true) {
    								tab_chaine.add(file.getName());
    								String ville=  extraire_ville(file.getName(),type);
    							    tab_ville.add(ville);
     
    					       }
    					   }
    					   try {
    							it = tab_ville.iterator();
    							new ToastMessageTask().execute("voila le nombre de ville"+tab_ville.size());
    							//ici je dois verifier combien de ville j'ai trouvé 
    							//si j'ai trouvé 0 ville alors j'affiche un message que aucun fichier ne corespond  au critere
    							if (tab_ville.size()==0)
    							{
    								new ToastMessageTask().execute("NO");
    								return false;
    							}
     
    							//si j'ai trouvé plusieurs villes alors je dois sortir d'ici et donner la main à l'activité pour proposer à l'utilisateur de choisir une ville 
    							//j'ai mis true parceque pour arriver au onPostExecute et executer un code qui permet de lancer une autre activité .
    							//puis c'est le onactivityresult de l'activité englobante qui prend la main 
    							if (tab_ville.size()>1)
    								return true;
    							//ici j'ai qu'une seul ville alors je demande a telecharger les path que j'ai sauvegardé dans l'arraylist		
    							else {
    								try{ 
    									for(int i=0;i<tab_chaine.size();i++){
    										File file = new File("/sdcard"+
    												"/Fromcis/"+tab_chaine.get(i));
    										status =ftpDownload("/fromCIS/"+tab_chaine.get(i),Environment.getExternalStorageDirectory()+
    												"/Fromcis/"+tab_chaine.get(i));
    							        }
    								}catch(Exception e){
    									new ToastMessageTask().execute(e.getMessage());
     
    								}
    							 return false;
    								}
    						}catch(Exception e){
    							new ToastMessageTask()
    							.execute("on a un probleme  "+e.getMessage()); 
    						}
    ce qui reste c'est quand l'utilisateur choisit une ville alors c'est onActivityResult :
    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
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		// TODO Auto-generated method stub
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode==RESULT_OK)
    			   Toast.makeText(getBaseContext(), data.getExtras().getString("ville"), Toast.LENGTH_LONG).show();
    		       for(int i=0;i<cahine_save.size();i++){
    		    	   if(cahine_save.get(i).contains(data.getExtras().getString("ville"))){
    		    		 try {
    		    			   Log.i("voila le path du fichier a telecharger", cahine_save.get(i).toString());
    		    			 if (con != null)
    		   					con.cancel(true);
    		   				 con = new connexion(); 
    		    			 con.execute(cahine_save.get(i).toString());
    		    		   }catch(Exception e){
    		    			   Log.i("here i am ", e.getMessage());
     
    		    		   }
     
     
    		    	   }
     
    		       }
    	}
    la je passe un seul parametre pour que j'execute la premiere partie de le doinbackround

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (params.length==1){
    			Log.i("voila la chaine a telecharge ",params[0]);	
    			retour= ftpConnect("rita.blogistics.be", "blogisticstest",
    								"bLog-IExp!", 999, params[0], params[0]);
    			 return "NO";	
    			}
    et vola ce qui va executer juste cette partie dans ftpconnect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if (port == 999){
    							boolean sta=ftpDownload("/fromCIS/"+chaine,Environment.getExternalStorageDirectory()+
    									"/Fromcis/"+chaine);
    							File file = new File("/sdcard"+
    									"/Fromcis/"+chaine);
    					    return false;
    						}
    et je retourne NO pour que j'execute pas le code dans le onopenexecute sauf le con=null;


    j'espere que j'ai bien expliqué mon programme et j'espere que tu pourra m'aider .
    si t'as besoin d'autre chose je peux expliquer.
    bon pour resumer ce que je fait
    etape 1: l'utilisateur tape un numero et une date.
    etape 2: l'utilisateur choisit un tpe de document .
    etape 3 : je lance une asyntask pour chercher les document qui ont le meme critere que celles entrées par l'utilisateur.

    3.1 si je trouve aucun fichier je sors .
    3.2 si je trouve une seul ville je lance le telechargement depuis asyntask.
    3.3 si je trouve plusieurs ville je sors de asyntask , je demande à
    l'utilisateur de choisir une ville je reçois cette ville dans le onactivityresult , et puis je lance une autre asyntask qui contient toutes les informations et j'aurais pas besoin de faire une nouvelle recherche , c'est pour ça j'ai deux code qui s'executent dans le asyntask.

    Merci

Discussions similaires

  1. [JSP]Valider plusieurs saisie en meme temps
    Par mamiberkof dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/05/2006, 08h14
  2. [XSLT] Transformer plusieurs XML en même temps
    Par oamram dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/04/2006, 13h41
  3. [TP] Plusieurs sons en même temps
    Par gusgus dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 17/11/2005, 11h59
  4. Réponses: 8
    Dernier message: 06/07/2004, 14h17
  5. Plusieurs commandes en meme temps
    Par caribou_belle dans le forum Linux
    Réponses: 7
    Dernier message: 18/09/2003, 17h07

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