处理类的RunTimeExceptions

时间:2010-08-13 15:58:01

标签: java android exception-handling

我有一个扩展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?

1 个答案:

答案 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。