我有一个扩展Application
的类,它有很多方法,如:
public User getUser(String name);
public List<User> getFriends(User user);
public List<Game> getGames(User user);
包装服务类。
这里的问题是,如果我的设备上没有互联网,那么任何方法都无法正常工作。 所以我要做的就是:
public User getUser(String name) {
User ret = null;
try {
return myService.getUser(name);
} catch (NoInternetException e) {
NoInternetToast.show(this);
}
return ret;
}
有没有办法包装每个调用,所以我不必在Application
的每个方法上添加try catch?
答案 0 :(得分:3)
如果不使用Android上可用的任何第三方库,则没有简单的方法来包装类的方法。如果可以将应用程序功能提取到接口中,则可以使用java.lang.reflect.Proxy来实现接口 - 代理实现是一种调用实际实现方法的单一方法,并缓存和处理异常。
如果将代码分解为单独的类,并且界面对您来说是一种可行的方法,我可以提供更多详细信息。
编辑:这是详细信息:
您目前正在使用myService
来实现这些方法。如果您还没有,请创建一个声明服务方法的接口UserService:
public interface UserService {
User getUser(String name);
List<User> getFriends(User user);
List<Game> getGames(User user);
}
在现有的MyService
班级
class MyService implements UserService {
// .. existing methods unchanged
// interface implemented since methods were already present
}
为避免重复,异常处理实现为InvocationHandler
class HandleNoInternet implements InvocationHandler {
private final Object delegate; // set fields from constructor args
private final Application app;
public HandleNoInternet(Application app, Object delegate) {
this.app = app;
this.delegate = delegate;
}
public Object invoke(Object proxy, Method method, Object[] args) {
try {
// invoke the method on the delegate and handle the exception
method.invoke(delegate, args);
} catch (Exception ex) {
if ( ex.getCause() instanceof NoInternetException ) {
NoInternetToast.show(app);
} else {
throw new RuntimeException(ex);
}
}
}
}
然后在Application类中将其用作代理:
InvocationHandler handler = new HandleNoInternet(this, myService);
UserService appUserService = (UserService)Proxy.newProxyInstance(
getClass().getClassLoader(), new Class[] { UserService.class }, handler);
然后使用appUserService
而无需担心捕获NoInternetException。