2 回答

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
可以剪下以下幾行:
UnzipUtility unzipUtility = new UnzipUtility();
try {
unzipUtility.unzip(localFilePath, parentPath);
} catch (IOException e) {
e.printStackTrace();
}
在類SFTPActivity 中粘貼以下行的正下方:
Downloader(fileName);
的方法doInBackground。實(shí)際上,該方法doInBackground()在與該方法運(yùn)行的線程不同的線程中onCreate運(yùn)行。您嘗試在方法Downloader(fileName)完成其工作之前使用變量。這就是您在變量中看到空值的原因,例如:localFilePath和parentPath

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
您的代碼不起作用的原因是因?yàn)樵谶\(yùn)行此行時(shí):
unzipUtility.unzip(localFilePath, parentPath);
變量localFilePath和parentPath尚未設(shè)置。
您可能會(huì)爭(zhēng)辯說(shuō),它們是在方法中設(shè)置的,該方法Downloader在該unzip行之前調(diào)用。不幸的是,事實(shí)并非如此。在這種情況下,代碼執(zhí)行不是線性的,因?yàn)槟褂玫氖茿syncTask. 異步任務(wù)中的內(nèi)容與其后面的行同時(shí)運(yùn)行。
您的下載調(diào)用不會(huì)在調(diào)用之前完成unzipUtility.unzip,因?yàn)榕c創(chuàng)建新UnzipUtility對(duì)象相比,下載需要大量時(shí)間。
這就是為什么localFilePath并且parentPath為空。
解決此問(wèn)題的一種方法是將解壓縮邏輯也移動(dòng)到異步任務(wù)中:
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();
}
}
}
添加回答
舉報(bào)