2 回答
TA贡献1873条经验 获得超9个赞
可以剪下以下几行:
UnzipUtility unzipUtility = new UnzipUtility();
try {
unzipUtility.unzip(localFilePath, parentPath);
} catch (IOException e) {
e.printStackTrace();
}
在类SFTPActivity 中粘贴以下行的正下方:
Downloader(fileName);
的方法doInBackground。实际上,该方法doInBackground()在与该方法运行的线程不同的线程中onCreate运行。您尝试在方法Downloader(fileName)完成其工作之前使用变量。这就是您在变量中看到空值的原因,例如:localFilePath和parentPath
TA贡献1780条经验 获得超1个赞
您的代码不起作用的原因是因为在运行此行时:
unzipUtility.unzip(localFilePath, parentPath);
变量localFilePath和parentPath尚未设置。
您可能会争辩说,它们是在方法中设置的,该方法Downloader在该unzip行之前调用。不幸的是,事实并非如此。在这种情况下,代码执行不是线性的,因为您使用的是AsyncTask. 异步任务中的内容与其后面的行同时运行。
您的下载调用不会在调用之前完成unzipUtility.unzip,因为与创建新UnzipUtility对象相比,下载需要大量时间。
这就是为什么localFilePath并且parentPath为空。
解决此问题的一种方法是将解压缩逻辑也移动到异步任务中:
new AsyncTask<Void, Void, List<String>>() {
@Override
protected List<String> doInBackground(Void... params) {
try {
Downloader(fileName);
UnzipUtility unzipUtility = new UnzipUtility();
unzipUtility.unzip(localFilePath, parentPath);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute();
另一种方式是重写onPostExecute的AsyncTask还有:
new AsyncTask<Void, Void, List<String>>() {
// doInBackground goes here...
@Override
protected void onPostExecute(Long result) {
try {
UnzipUtility unzipUtility = new UnzipUtility();
unzipUtility.unzip(localFilePath, parentPath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
添加回答
举报