Без использования сторонних библиотек, которые могут быть доступны на 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);
}
}
}
}
Это затем используется в качестве прокси в вашем классе приложения:
InvocationHandler handler = new HandleNoInternet(this, myService);
UserService appUserService = (UserService)Proxy.newProxyInstance(
getClass().getClassLoader(), new Class[] { UserService.class }, handler);
Вызатем используйте appUserService
, не беспокоясь о перехвате NoInternetException.