Вы правы: остановка сопрограммы не отменяет UnityWebRequest
, вы просто больше не отслеживаете ее.
На самом деле UnityWebRequest.Abort
должен делать именно это
В процессе выполнения остановите UnityWebRequest
как можно скорее.
Этот метод может быть вызван в любое время. Если UnityWebRequest
еще не завершен, UnityWebRequest
остановит загрузку или выгрузку данных как можно скорее. Прерванные UnityWebRequests
считаются системными ошибками. Либо isNetworkError
, либо свойство isHttpError
вернет true
, а свойство error
будет "User Aborted"
.
Однако это имеет смысл, конечно, только если вы действительно проверите результат запрос, который в данный момент вы не выполняете, и вы должны его выполнить в любом случае!
Способ его использования состоит в том, чтобы сделать поле uwr
широким классом, чтобы вы могли получить к нему доступ из другого места и, как было сказано на самом деле добавьте проверку, если загрузка прошла успешно:
private UnityWebRequest uwr;
private IEnumerator downLoadFromServer()
{
...
// NOTE: Remove the var so the class field uwr is assigned to, not only
// a local variable
using(uwr = UnityWebRequest.Get(...))
{
...
// Always check if a request was actually successful before continuing
if(uwr.isHttpError || uwr.isNetworkError || !string.IsNullOrWhiteSpace(uwr.error))
{
Debug.LogWarning($"Download Failed with {uwr.responseCode}, reason: {uwr.error}", this);
progressText.text = $"Download Failed: {uwr.error}";
// Cancel this Coroutine
yield break;
}
var yourBytes = uwr.downloadHandler.data;
...
}
//Install APK
installApp(savePath);
}
Затем вы можете просто сделать
public void AbortDownload()
{
if(uwr != null && !uwr.isDone)
{
Debug.Log("Aborting download ...", this);
uwr.Abort();
}
else
{
Debug.Log("Not downloading, nothing to do ...", this);
}
}
, что должно сделать загрузку "неудачной" и, таким образом, также sh Coroutine