我正在使用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!
答案 0 :(得分:1)
通过使用AsyncTask
将这个长时间运行的任务放入后台线程,您已经开始了正确的路径,这样它就不会阻止UI。但是,通过在执行任务后立即调用get()
,您无论如何都会有效地阻止UI线程,因为get()
是一种阻塞方法。来自SDK文档:
AsyncTask.get()
如果需要等待计算完成,然后检索其结果。
您应该做的是重构AsyncTask
以使用onPostExecute()
方法。当后台任务完成时,将调用此方法,并将结果值作为参数,并在UI线程上调用,以便您可以安全地使用它更新任何内容。
HTH