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