Обработка RunTimeException для класса - PullRequest
1 голос
/ 13 августа 2010

У меня есть класс, расширяющий 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;
}

Есть ли способ обернуть каждый вызов, так что мне не нужно добавлять ловушку try для каждого метода моего Application?

1 Ответ

3 голосов
/ 13 августа 2010

Без использования сторонних библиотек, которые могут быть доступны на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...