我正在扩展 AsyncTaskLoader,稍后我会通过 LoaderManager 在 Fragment 中使用它。是否有建议的方法来处理异步任务期间发生的错误?当发生互联网连接错误时,我想弹出消息要求用户取消或重试。
我现在能想到的唯一方法是让 Loader 在错误时返回 null 或将加载的对象包装到另一个具有状态代码的对象中。
我正在扩展 AsyncTaskLoader,稍后我会通过 LoaderManager 在 Fragment 中使用它。是否有建议的方法来处理异步任务期间发生的错误?当发生互联网连接错误时,我想弹出消息要求用户取消或重试。
我现在能想到的唯一方法是让 Loader 在错误时返回 null 或将加载的对象包装到另一个具有状态代码的对象中。
我们在上一个项目中所做的:创建一个包含泛型和异常的包装器,如下所示:
public class AsyncTaskResult<T> {
private final T result;
private final Exception error;
//getter & setter
}
捕获您的所有异常doInBackground(...)
并将它们打包到结果包装器中(如果没有错误,则为结果)。在您的 UI 中检查包装器是否是异常,然后显示相应的错误消息,否则使用结果填充字段。
对我们来说,定义哪些独特类型的异常也是一种很好的做法(例如,具有可恢复错误的异常,您只显示对话框或应用程序失败,您需要将用户踢到主菜单)并且只抛出这些种类(在你的异步任务中捕获特定的),所以你不必为数百个不同的异常而烦恼,也不必抽象你的错误处理。您还可以提供带有正确 I18n 错误消息的字符串键,因此您只需编写e.getMessage()
正如您所建议的,在返回包含有效负载(如果有)和状态代码的复合对象时,我已经看到了很好的结果。然后Fragment
托管的AsyncTaskLoader
可以显示适当且信息丰富的错误。这种方法的另一个优点是它使用了内置的加载程序生命周期。
另一种选择是注册一个侦听器,AsyncTaskLoader
当发生错误时您将通知该侦听器。Facebook SDK有一个将错误侦听器与加载程序一起使用的示例。