Android 如何终止异步任务?

Android 如何终止异步任务?,android,Android,事实上,我的程序中有一个问题。 我通常必须从FTP服务器下载文件,当我单击“我必须下载文件”时,我有一个按钮来完成此操作。 问题是,当我点击几次。 任务不会运行,因为我无法杀死asyntask。 这里我举了一个简单的例子: public class MainActivity extends Activity { Connexion conx=null; @Override protected void onCreate(Bundle savedInstanceState) { su

事实上,我的程序中有一个问题。
我通常必须从FTP服务器下载文件,当我单击“我必须下载文件”时,我有一个按钮来完成此操作。
问题是,当我点击几次。 任务不会运行,因为我无法杀死asyntask。 这里我举了一个简单的例子:

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;
    }
}
}
公共类MainActivity扩展活动{
Connexion conx=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮bt=(按钮)findViewById(R.id.button1);
bt.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(conx!=null){
Log.i(“瞧”,“我们在这里1”);
conx.cancel(真);
conx=新连接();
conx.execute(“73383_20130426_Tessenderlo_VBR_3.pdf”);
}否则{
conx=新连接();
conx.execute(“73383_20130426_Tessenderlo_VBR_3.pdf”)}
}
});
}
类连接扩展了异步任务{
FTP客户端MFTP客户端;
@凌驾
受保护的字符串doInBackground(字符串…参数){
Log.i(“瞧”,“我们在这里2”);
字符串chaine=params[0];
试一试{
mFTPClient=新的FTPClient();
mFTPClient.connect(“站点”,21);
Log.i(“瞧”,“我们在这里4”);
if(FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())){
布尔状态=mFTPClient.login(“用户”、“通过”);
mFTPClient.enterLocalPassiveMode();
ftpDownload(“/fromCIS/”+链,
Environment.getExternalStorageDirectory()
+“/Fromcis/”+chaine);
mFTPClient.logout();
mFTPClient.disconnect();
}
}捕获(例外e){
}
返回“zaki”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
Log.i(“瞧”,“我们在这里投递”);
conx=null;
}
公共布尔ftpDownload(字符串srcFilePath、字符串desFilePath){
布尔状态=假;
试一试{
FileOutputStream desFileStream=新的FileOutputStream(
文件路径);
;
status=mFTPClient.retrieveFile(srcFilePath,desFileStream);
desFileStream.close();
返回状态;
}捕获(例外e){
Log.d(例如getCause()+,“下载失败”);
}
返回状态;
}
}
}
我必须在代码中添加什么来修复我的错误。
非常感谢你的帮助


非常感谢您的帮助我找到了解决方案,问题出在Retrieve File方法中,我在本次讨论中找到了解决方案。取消(true)要停止异步任务,您必须执行以下操作:

首先-从主线程:

conx.cancel(true);
第二个-在doInBackgroundMethod中(字符串参数..)


您可以使用
task.cancel(true)
但通常,如果在
doInBackground()
中有一个循环,并检查其中
isCancelled
的值,则它会起作用。但在您的情况下,没有循环。

而不是:

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");}
只要做:

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

看一看,这只是停止它。它不会扼杀任务。在取消<代码> AycCastase<代码>时,几乎没有其他事情要考虑。看到@hasanghaforian的答案了吗?@zakzak你为什么要点击几次?从中下载另一个文件server@zakzak当用户单击按钮时,首先检查加载上一个文件是否已完成?如果否,请注意用户等待更多时间,稍后再试。但问题是程序在ftpDownload方法中是bloket,并且y-用户不能等待无限时间,如果任务是blokedsorry,我必须杀死asyntask。我使用了blokedsorry,但它没有杀死asyntask,并且在几个clik中,我没有程序的答案
// Kill any remaining tasks
conx = null;
// Start the new task
conx=new Connexion();
conx.execute("73383_20130426_Tessenderlo_VBR_3.pdf");