【问题标题】:Why does this refresh command crash the app?为什么此刷新命令会使应用程序崩溃?
【发布时间】:2022-08-16 03:36:44
【问题描述】:

这是与刷新命令相关的所有行

这是 XAML 代码中的主要绑定

RefreshCommand=\"{Binding RefreshCommand}\"

这是视图模型

async Task Refresh()
    {
        IsBusy = true;

        await Task.Delay(2000);

        Note.Clear();

        var notes = await NoteService.GetNote();

        Note.AddRange(notes);

        IsBusy = false;

    }

GetNote 方法看起来像这样

public static async Task<IEnumerable<Note>> GetNote()
    {
        await Init();

        var note = await db.Table<Note>().ToListAsync();
        return note;
    }

还有其他方法包括刷新命令,只要排除刷新部分它们就不会崩溃,因此我认为问题与此刷新方法有关。任何帮助表示赞赏!

  • 哪条线导致崩溃?单步执行代码和/或注释掉行,直到将其隔离。
  • 如果您有导致应用程序崩溃的代码,您应该尝试的第一件事是在它周围添加一个try/catch抓住导致它的异常。了解导致崩溃的异常是修复它的第一步
  • 好的,如果我删除这两行 var notes = await NoteService.GetNote(); Note.AddRange(notes); 应用程序不会崩溃,但它也没有完成它的工作,所以也许它与 GetNote 方法有关?我会进一步调查。
  • 或者您可能需要 30 秒来添加 try/catch 并获取导致崩溃的实际异常。和/或按照史蒂夫的建议单步调试调试器中的代码。
  • 这就是我要找的吗? \“应用程序中检测到 JNI 错误:调用 JNI GetObjectClass 时出现未决异常 android.runtime.JavaProxyThrowable:Xamarin.Forms.Xaml.XamlParseException:位置 35:33。找不到 NotePage 引用的对象\”

标签: c# xamarin


【解决方案1】:

Note 是否绑定到 UI 元素,例如 ListView?

如果是这样,您可能必须确保在主 UI 线程中执行与 UI 相关的操作,例如 Note.AddRange(notes);

Device.BeginInvokeOnMainThread (() => {
    var notes = await NoteService.GetNote();
    Note.AddRange(notes);
});

更多详情:Why use Device.BeginInvokeOnMainThread() in a Xamarin application?

【讨论】:

  • 我用Device.BeginInvokeOnMainThread(() =&gt; { Note.AddRange(notes); }); 替换了它,但是只要使用 Refresh 方法,应用程序仍然会崩溃。另外,ListView 下还有ItemsSource="{Binding Note}"。删除所述绑定会阻止应用程序崩溃,但也会像预期的那样阻止应用程序执行它应该执行的操作。
  • 您可以尝试将var notes = await NoteService.GetNote(); 也放在主线程调用中吗?这也可能需要在主线程中执行,具体取决于db 变量是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2012-01-24
  • 2021-04-15
  • 2018-04-03
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多