2010-08-13 58 views
1

的RunTimeExceptions我有一個延伸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的每一個方法的嘗試捕捉?

+0

這與您的問題沒有直接關係,但使用ConnectivityManager檢測Internet連接的存在而不是捕獲NoInternetException可能有意義(http://developer.android.com/reference/android/net/ ConnectivityManager.html) – 2010-08-13 16:27:52

+0

@Daniel Lew:是的,我知道,但如果我這樣做,我需要修改我的應用程序中的每個視圖,以禁用鏈接,如果互聯網關閉。 – Macarse 2010-08-13 17:06:55

+0

從長遠來看,禁用鏈接對於您的應用來說可能會更好,無論如何都是UI方式。只是一個想法。 :) – 2010-08-13 20:28:37

回答

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); 
      } 
     } 
    } 
} 

這則用作代理,在您的應用程序類:

InvocationHandler handler = new HandleNoInternet(this, myService); 
UserService appUserService = (UserService)Proxy.newProxyInstance(
    getClass().getClassLoader(), new Class[] { UserService.class }, handler); 

然後,您使用appUserService,而不必擔心捕獲NoInternetException。

+0

使用代理實現DRY有意義嗎? – Macarse 2010-08-13 17:05:34

+0

@Macarse - 非常非常。在普通的java中,Proxying是許多AOP框架的支柱,方面是避免重複自我的一種方法。在這種情況下,該方面是一致的異常處理。通過代理,您只需定義一次所需的行爲,並將其應用於需要一致性異常處理的所有方法。除了代碼生成工具之外,我沒有看到其他的選擇。 – mdma 2010-08-13 17:13:51

+0

很酷。你能給我一些關於如何將它應用於我的例子的見解嗎? – Macarse 2010-08-13 17:23:02