Причина, по которой ваш код не работает, заключается в том, что на момент запуска этой строки:
unzipUtility.unzip(localFilePath, parentPath);
переменные localFilePath
и parentPath
не были установлены.
Вы можете утверждать, что они установлены в методе Downloader
, который вызывается перед строкой unzip
.К сожалению, это не так.В этом случае выполнение кода не является линейным, потому что вы используете AsyncTask
.Материал в асинхронной задаче выполняется одновременно со строками, которые идут после нее.
Ваш вызов на загрузку не завершится до вызова unzipUtility.unzip
, поскольку загрузка занимает огромное количество времени по сравнению с созданиемnew UnzipUtility
object.
Вот почему 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();
}
}
}