我们正在使用 MVVMCross 框架为 iOS、Android 和 WP7 开发一个跨平台应用程序,但我在 MvxApplication 中缺少一个可以覆盖的方法,它可以用作平台中立的未处理异常处理程序(由平台特定的处理程序调用) )。
所以问题是,在 MVVMCross 应用程序的异步调用期间,一般处理异常的建议方法是什么?
谢谢,阿提拉
我们正在使用 MVVMCross 框架为 iOS、Android 和 WP7 开发一个跨平台应用程序,但我在 MvxApplication 中缺少一个可以覆盖的方法,它可以用作平台中立的未处理异常处理程序(由平台特定的处理程序调用) )。
所以问题是,在 MVVMCross 应用程序的异步调用期间,一般处理异常的建议方法是什么?
谢谢,阿提拉
对于真正意外的异常(崩溃!),这个问题目前没有答案:请参阅MonoTouch 和 MonoDroid 中的崩溃报告
但是,有关如何在异步调用期间处理异常的建议,请查看 BestSellers 示例:MvvmCross BestSellers Sample
BestSellers 使用 2 种技术,我发现我在 MvvmCross 应用程序中使用了很多:
在更详细的层面上,BestSellers 所做的是:
每个 ViewModel 使用对网络服务的直接调用来获取书籍信息。例如,类别列表构造为:
public CategoryListViewModel()
{
AsyncLoad();
}
private void AsyncLoad()
{
GeneralAsyncLoad(URL_CATEGORIES, ProcessResult);
}
其中 GeneralAsyncLoad 在共享BaseViewModel中定义:
protected void GeneralAsyncLoad(string url, Action<Stream> responseStreamHandler)
{
try
{
IsLoading = true;
var request = WebRequest.Create(url);
request.BeginGetResponse((result) => GeneralProcessResponse(request, result, responseStreamHandler), null);
}
catch (ThreadAbortException)
{
throw;
}
// obviously we could do better than catching all `Exception` here!
catch (Exception exception)
{
IsLoading = false;
ReportError("Sorry - problem seen " + exception.Message);
}
}
上述异常处理程序中的 ReportError 方法使用注入的对象 - 一个IErrorReporter
.
这个注入的对象在 App 构建过程中被初始化为单例 -ErrorApplicationObject
见App.cs
在它们的构建和设置过程中,UI 项目都从同一个单例中订阅事件 - 但使用IErrorSource
接口代替或IErrorReporter
.
然后,这允许每个平台显示它自己的错误显示 - 例如:
显然,如果您需要错误处理和错误显示 - 例如,如果您想重试异步操作或者如果您想加载数据的离线副本 - 那么您可以将其添加到 ViewModel 和 BaseViewModel 中的错误处理中.