Как остановить загрузку UnityWebRequest в android? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь выяснить, как немедленно остановить загрузку UnityWebRequest с помощью кнопки в android приложении.

Остановка сопрограммы с помощью StopCoroutine("downLoadFromServer"); не останавливает UnityWebRequest. Я попытался использовать UnityWebRequest.Dispose(); или UnityWebRequest.Abort(); безуспешно. Ниже приведена загрузка, которую я пытаюсь остановить.

private IEnumerator downLoadFromServer()
{

    var url = "https://example.com/app.apk"; 
    var savePath = Path.Combine(Application.persistentDataPath, "data", "app.apk");              

    using (var uwr = UnityWebRequest.Get(url))
    {
        uwr.SetRequestHeader("Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("test:test")));
        uwr.SendWebRequest();

        while (!uwr.isDone)
        {
            progressText.text = $"Progress: {uwr.downloadProgress:P}";
            yield return null;
        }

        var yourBytes = uwr.downloadHandler.data;

        progressText.text = $"Done downloading. Size: {yourBytes.Length}";

        //Create Directory if it does not exist
        var directoryName = Path.GetDirectoryName(savePath);
        if (!Directory.Exists(directoryName))
        {
             Directory.CreateDirectory(directoryName);
            progressText.text = "Created Dir";
        }

        try
        {
            //Now Save it
            System.IO.File.WriteAllBytes(savePath, yourBytes);
            Debug.Log("Saved Data to: " + savePath.Replace("/", "\\"));
            progressText.text = "Saved Data";
        }
        catch (Exception e)
        {
            Debug.LogWarning("Failed To Save Data to: " + savePath.Replace("/", "\\"));
            Debug.LogWarning("Error: " + e.Message);
            progressText.text = "Error Saving Data";
        }
    }

    //Install APK
    installApp(savePath);
}

Спасибо, Крис

1 Ответ

1 голос
/ 06 марта 2020

Вы правы: остановка сопрограммы не отменяет 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...