Xamarin和Android-从方法退出时崩溃

时间:2018-12-16 19:17:06

标签: android xamarin crash httpclient

我不知道该说些什么。 我有这种方法:

#define DECL_FL(IE) 1e##IE##f
#define DECL_FL_E_NEG(IE) 1e-##IE##f
float val[] = 
{
    DECL_FL(12),
    DECL_FL_E_NEG(12),
    DECL_FL(12),
};

没什么特别的。 执行client.SendAsync(rm),response.StatusCode正常。 从此方法退出时,应用程序只会崩溃。

输出仅显示此断言:

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;
}

仅此而已。 客户端是HttpClient。 我在Android项目中进行了设置: HttpClient实施设置为Android。

有人知道什么地方可能出问题吗?

修改

SendAsyncRequest的用法如下:

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)

2 个答案:

答案 0 :(得分:2)

根据您提供的示例项目代码

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

您正在呼叫async void并在启动时忘记了。

您将无法捕获任何引发的异常,这将解释为什么App崩溃而没有警告。

引用Async/Await - Best Practices in Asynchronous Programming

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
}

这样,您现在至少应该能够捕获引发的异常以确定失败的原因。

答案 1 :(得分:1)

尝试将您的compileSdkVersion更新为更高版本并进行检查。 也请尝试

>     Go to: File > Invalidate Caches/Restart and select Invalidate and Restart