Загрузка данных с сервера в приложении на nativescript-angular
Я разрабатываю кроссплатформенное приложение с использованием связки NativeScript - Angular, и мне нужно загружать большой объем данных с сервера в фоновом режиме. Прямо сейчас я использую Angular service для загрузки, но когда пользователь закрывает мое приложение и снова открывает его после некоторого периода (подозреваю, что Android выгрузил основную часть приложения из оперативной памяти), запускается новая копия службы, в то время как старая продолжает загрузку, поэтому в приложении есть две службы, каждая из которых загружает данные, к тому же я не имею доступа к старой службе. Как я могу решить эту проблему? Или, если мне нужно запустить для этого фоновую задачу, как я могу это сделать и могу ли я использовать свой службу в этой задаче?
Служба, которую я использую во всем приложении для загрузки данных с сервера:
@Injectable({
providedIn: "root"
})
export class DataService implements OnDestroy {
private helper: Helper;
constructor(private http: HttpClient, translate: TranslateService) {
this.helper = new Helper(translate);
}
downloadData(regionId, languageId: number = 2) {
return fetch(this.BASE_DOMAIN + "/data/" + regionId + "_" + languageId + ".json")
.then((response) => response.json())
.then((responseJson) => {
this.helper.setOfflineStatus(false);
if (responseJson.length === undefined
|| responseJson.length === null
|| responseJson.length === 0) {
responseJson = [];
}
return responseJson;
})
.catch((error) => {
console.error(error);
this.setOffline();
});
}
processItem(regionId, itemObject) {
const findItem = itemsDb.query({
select: [],
where: [{property: "uid", comparison: "equalTo", value: itemObject.uid}]
});
if (findItem.length === 0) {
itemsDb.createDocument(itemObject);
} else {
itemsDb.updateDocument(findItem[0].id, itemObject);
}
const objectToSearchTitle = {
uid: itemObject.uid,
title: itemObject.title.toLowerCase()
};
this.helper.addToTitlesArray(regionId, objectToSearchTitle);
}
}
Собственно, сама служба, которая занимается фоновой загрузкой нужных файлов:
@Injectable({
providedIn: "root"
})
export class CityDataService implements OnDestroy {
constructor(private dataService: DataService) {
console.log("Service starts");
}
loadCity(item, languageId: number = 2) {
setTimeout(() => {
this.dataService.downloadData(item.uid, languageId).then((items: Array<object>) => {
if (items !== undefined && items !== null) {
const itemsCount = items.length;
const imagesLoadedObject = {count: 0};
if (items.length > 0) {
let itemsCounter = 0;
const itemsArray = _.clone(items);
const loadInterval = setInterval(() => {
// I start loading from my component, then hide app and still see this log,
// but if I open the app again and Android has already removed it from RAM
// (as I think, because sometimes all is ok and new service doesn't start)
// I get new log "Service starts" from constructor and continue getting
// logs from here, because old service object is still alive
console.log("Loading...");
const itemElement = itemsArray.shift();
if (itemElement !== undefined && itemElement !== null) {
itemsCounter += 1;
this.dataService.processItem(item.uid, itemElement);
} else {
clearInterval(loadInterval);
// some code...
this.loadedData[item.uid] = true;
}
}, 10);
}
}
});
const completeInterval = setInterval(() => {
if (this.loadedData[item.uid] || false) {
clearInterval(completeInterval);
// some code...
}
}, 500);
}, 10);
}
}
Компонент, где запускаю загрузку:
@Component({
selector: "...",
templateUrl: "..."
})
export class CityChooseComponent extends CommonComponent implements OnInit {
constructor(
private dataService: DataService,
private cityDataService: CityDataService,
private routerExtensions: RouterExtensions,
private _route: ActivatedRoute,
translate: TranslateService
) {
super(translate);
this.helper = new Helper(translate);
}
loadCity(item) {
this.cityDataService.loadCity(item, getNumber(Constants.LANGUAGE_ID));
}
}