org.apache.commons.net.ftp.FTPClient.storeFile冻结交互和动画

时间:2012-03-02 20:40:00

标签: android

我正在使用org.apache.commons.net.ftp.FTPClient通过Android应用程序与ftp服务器通信我正在录制视频,然后将其上传到ftp服务器。一切都很好,直到我调用storeFile,此时应用程序会阻止任何交互,直到上传完成。有没有办法解决?我正在开发API lvl 12。 我的设置如下我有一个类在后台调用服务来处理视频录制以及ftp设置。在FTP类中,我在asynctasks中有任何fptclient交互。这是我上传文件的方法:

public boolean upload(String srcFilePath, String desFileName, String desDirectory)
{
    if(!isLoggedIn())
    {
        return false;
    }
    boolean status = false;
    try
    {
        status = new AsyncTask<String, Void, Boolean>(){
            @Override
            protected Boolean doInBackground(String... args) {
                boolean status = false;
                try {
                    String srcFilePath = args[0];
                    String desFileName = args[1];
                    String desDirectory = args[2];
                    FileInputStream srcFileStream = new FileInputStream(srcFilePath);

                    // change working directory to the destination directory
                    if (changeDirectory(desDirectory,true)) {
                        status = mFTPClient.storeFile(desFileName, srcFileStream);
                    }
                    srcFileStream.close();
                    return status;
                } catch (Exception e) {
                    Log.d(TAG, "upload failed");
                    e.printStackTrace();
                    return false;
                }
            }
         }.execute(srcFilePath, desFileName, desDirectory).get();
    } catch (InterruptedException e)
    {
        e.printStackTrace();
        return status;
    } catch (ExecutionException e)
    {
        e.printStackTrace();
        return status;
    }
    return status;

}

非常感谢任何帮助!

Devunwired的帖子工作了! Hoorah!

1 个答案:

答案 0 :(得分:1)

通过使用AsyncTask将这个长时间运行的任务放入后台线程,您已经开始了正确的路径,这样它就不会阻止UI。但是,通过在执行任务后立即调用get(),您无论如何都会有效地阻止UI线程,因为get()是一种阻塞方法。来自SDK文档:

  

AsyncTask.get()

     

如果需要等待计算完成,然后检索其结果。

您应该做的是重构AsyncTask以使用onPostExecute()方法。当后台任务完成时,将调用此方法,并将结果值作为参数,并在UI线程上调用,以便您可以安全地使用它更新任何内容。

HTH