Xamarin & Android - сбой при выходе из метода - PullRequest
0 голосов
/ 16 декабря 2018

Я не знаю, что я могу сказать больше.У меня есть этот метод:

public async Task<HttpResponseMessage> SendAsyncRequest(string uri, string content, HttpMethod method, bool tryReauthorizeOn401 = true)
{
    HttpRequestMessage rm = new HttpRequestMessage(method, uri);
    if (!string.IsNullOrWhiteSpace(content))
        rm.Content = new StringContent(content, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await client.SendAsync(rm);
    if (response.StatusCode == HttpStatusCode.Unauthorized && tryReauthorizeOn401)
    {
        var res = await AuthenticateUser();
        if(res.user == null)
            return response;
        return await SendAsyncRequest(uri, content, method, false);
    }

    return response;
}

Ничего особенного.client.SendAsync (rm) выполняется, response.StatusCode в порядке.Приложение просто падает при выходе из этого метода.

Вывод показывает мне только это утверждение:

12-16 20:09:22.025 F/        ( 1683): * Assertion at /Users/builder/jenkins/workspace/xamarin-android-d15-9/xamarin-android/external/mono/mono/mini/debugger-agent.c:4957, condition `is_ok (error)' not met, function:set_set_notification_for_wait_completion_flag, Could not execute the method because the containing type is not fully instantiated. assembly:<unknown assembly> type:<unknown type> member:(null)
12-16 20:09:22.025 F/libc    ( 1683): Fatal signal 6 (SIGABRT), code -6 in tid 1683 (omerang.Android)

И больше ничего.клиент HttpClient.У меня есть настройки в моем проекте Android: Реализация HttpClient установлен на Android.

Кто-нибудь знает, что может быть не так?

edit

SendAsyncRequest используется так:

public async Task<(HttpResponseMessage response, IEnumerable<T> items)> GetListFromRequest<T>(string uri)
{
    HttpResponseMessage response = await SendAsyncRequest(uri, null, HttpMethod.Get);
    if (!response.IsSuccessStatusCode)
        return (response, null);

    string content = await response.Content.ReadAsStringAsync();
    var items = JsonConvert.DeserializeObject<IEnumerable<T>>(content);
    return (response, new List<T>(items));
}

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

На основе предоставленного вами примера кода проекта, который вы указали

protected override async void OnStart()
{
    Controller c = new Controller();
    TodoItem item = await c.GetTodoItem(1);
    TodoItem item2 = await c.GetTodoItem(2);
}

Вы звоните async void и забудьте о запуске.

Вы не сможете перехватывать любые сгенерированные исключения, что объясняет, почему приложение не работает без предупреждения.

Ссылка Асинхронное / ожидание - Рекомендации по асинхронному программированию

async void следует использовать только с обработчиками событий, поэтому я бы предложил добавить событие и обработчик.

на основе предоставленного примера это может выглядеть следующим образом

public partial class App : Application {
    public App() {
        InitializeComponent();
        MainPage = new MainPage();
    }

    private even EventHander starting = delegate { };
    private async void onStarting(object sender, EventArgs args) {
        starting -= onStarting;
        try {
            var controller = new Controller();
            TodoItem item = await controller.GetTodoItem(1);
            TodoItem item2 = await controller.GetTodoItem(2);
        } catch(Exception ex) {
            //...handler error here
        }
    }

    protected override void OnStart() {
        starting += onStarting;
        starting(this, EventArgs.Empty);
    }

    //...omitted for brevity
}

Теперь вы должны хотя бы иметь возможность перехватить выброшенное исключение, чтобы определить, что происходит с ошибкой.

0 голосов
/ 19 декабря 2018

попробуйте обновить ваш compileSdkVersion до более поздней версии и проверьте.также попробуйте выполнить следующие действия:

>     Go to: File > Invalidate Caches/Restart and select Invalidate and Restart
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...