Sans utiliser de bibliothèques tierces pouvant être disponibles sur Android, il n'existe pas de moyen simple d'encapsuler les méthodes d'une classe. Si vous pouvez extraire la fonctionnalité de votre application dans une interface, vous pouvez utiliser java.lang.reflect.Proxy pour implémenter votre interface - l'implémentation du proxy est une méthode unique qui appelle votre méthode d'implémentation réelle, et met en cache et gère l'exception.
Je peux fournir plus de détails si l'affacturage du code dans une classe distincte et une interface est une approche réalisable pour vous.
EDIT: Voici les détails:
Vous êtes myService
, qui met en œuvre les méthodes. Si vous ne possédez pas déjà, créer un UserService d'interface qui déclare les méthodes de service:
public interface UserService {
User getUser(String name);
List<User> getFriends(User user);
List<Game> getGames(User user);
}
Et déclarer cette interface sur votre classe MyService
existante,
class MyService implements UserService {
// .. existing methods unchanged
// interface implemented since methods were already present
}
Pour ensuite éviter les répétitions, l'exception la manipulation est mise en œuvre en tant 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);
}
}
}
}
Il est ensuite utilisé comme proxy, dans votre classe d'application:
InvocationHandler handler = new HandleNoInternet(this, myService);
UserService appUserService = (UserService)Proxy.newProxyInstance(
getClass().getClassLoader(), new Class[] { UserService.class }, handler);
Vous utilisez ensuite appUserService
sans avoir à vous soucier de l'exception NoInternetException.
Ceci n'est pas directement lié à votre question, mais il peut être judicieux d'utiliser ConnectivityManager pour détecter l'existence d'une connexion Internet au lieu d'intercepter l'exception NoInternet (http://developer.android.com/reference/android/net/ ConnectivityManager.html) –
@Daniel Lew: Oui, je le sais, mais si je le fais, j'ai besoin de modifier chaque vue de mon application pour désactiver les liens si Internet est désactivé. – Macarse
Désactiver les liens peut-être mieux pour votre application à long terme de toute façon, UI-sage. Juste une pensée. :) –