2013-06-03 2 views
0

en fait j'ai un problème dans mon programme.
Je dois normalement télécharger des fichiers à partir d'un serveur FTP, et j'ai un bouton pour le faire lorsque je clique sur Je dois télécharger le fichier.
le problème est que lorsque je clique plusieurs fois. la tâche ne s'exécutera pas, car je n'arrive pas à tuer asyntask. ici, je mets un exemple simple:comment tuer une tâche asynchrone?

public class MainActivity extends Activity { 


Connexion conx=null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button bt= (Button) findViewById(R.id.button1); 
    bt.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (conx!=null){ 
       Log.i("voila", "we are here 1"); 
       conx.cancel(true); 
       conx=new Connexion(); 
       conx.execute("73383_20130426_Tessenderlo_VBR_3.pdf"); 

      }else { 
      conx=new Connexion(); 
      conx.execute("73383_20130426_Tessenderlo_VBR_3.pdf");} 

     } 
    }); 
} 

class Connexion extends AsyncTask<String, String, String> { 
    FTPClient mFTPClient; 
    @Override 
    protected String doInBackground(String... params) { 
     Log.i("voila", "we are here 2"); 
     String chaine = params[0]; 
      try { 
        mFTPClient = new FTPClient(); 
        mFTPClient.connect("site", 21); 
        Log.i("voila", "we are here 4"); 
        if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) { 
         boolean status = mFTPClient.login("user", "pass"); 
         mFTPClient.enterLocalPassiveMode(); 
         ftpDownload("/fromCIS/" +chaine , 
           Environment.getExternalStorageDirectory() 
             + "/Fromcis/" + chaine); 
          mFTPClient.logout(); 
          mFTPClient.disconnect(); 

        } 
       } catch (Exception e) { 

       } 
      return "zaki";  
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     Log.i("voila", "we are here onpost"); 
     conx=null; 

    } 

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

ce que je dois ajouter dans mon code pour corriger mon bug.
je vous remercie beaucoup pour votre aide

merci beaucoup pour votre aide, je trouve la solution, le problème était dans la Methode de retrivefile, je l'ai trouvé la solution dans cette discussion enter link description here

+1

Jetez un oeil à [CETTE REPONSE] (http://stackoverflow.com/a/10882600/1289716) – MAC

Répondre

1

Vous pouvez utiliser task.cancel(true); mais habituellement il fonctionne si vous avez une boucle dans votre doInBackground() et de vérifier la valeur de isCancelled en elle. Mais dans votre cas, il n'y a pas de boucle.

+0

et ce que je dois faire dans mon cas? –

+0

@zakzak Pourquoi cliques-tu plusieurs fois? – hasanghaforian

+0

pour télécharger un autre fichier depuis le serveur –

0

task.cancel(true); pour arrêter une AsyncTask

+1

Ceci est seulement l'arrête. Cela ne tue pas la tâche. –

+0

Et il y a peu d'autres choses à considérer lors de l'annulation d'une 'AsyncTask'. Voir la réponse par @hasanghaforian: http://developer.android.com/reference/android/os/AsyncTask.html#cancel%28boolean%29 –

1

afin de vous Stom a à voir:

de première de votre fil conducteur:

conx.cancel(true); 

et deuxième dans vos doInBackgroundMethod (String params ..)

if(this.isCancelled()){ 
return "interrupt" 
} 
0

Au lieu de:

if (conx!=null){ 
     Log.i("voila", "we are here 1"); 
     conx.cancel(true); 
     conx=new Connexion(); 
     conx.execute("73383_20130426_Tessenderlo_VBR_3.pdf"); 
}else { 
     conx=new Connexion(); 
     conx.execute("73383_20130426_Tessenderlo_VBR_3.pdf");} 

Il suffit de faire:

// Kill any remaining tasks 
conx = null; 
// Start the new task 
conx=new Connexion(); 
conx.execute("73383_20130426_Tessenderlo_VBR_3.pdf"); 
+0

désolé je l'ai utilisé mais il ne tue pas l'asyntask, et dans plusieurs clik je n'ai pas de réponse du programme –

Questions connexes