沒有使用任何可能在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。
這與您的問題沒有直接關係,但使用ConnectivityManager檢測Internet連接的存在而不是捕獲NoInternetException可能有意義(http://developer.android.com/reference/android/net/ ConnectivityManager.html) – 2010-08-13 16:27:52
@Daniel Lew:是的,我知道,但如果我這樣做,我需要修改我的應用程序中的每個視圖,以禁用鏈接,如果互聯網關閉。 – Macarse 2010-08-13 17:06:55
從長遠來看,禁用鏈接對於您的應用來說可能會更好,無論如何都是UI方式。只是一個想法。 :) – 2010-08-13 20:28:37