我想延伸一下我之前的问题。
如果在我的代码中有一个由未来API提供的方法,也如果我检查版本,我在LogCat
中有以下警告04-24 09:30:12.565: I/dalvikvm(471): Could not find method android.view.ViewTreeObserver.removeOnGlobalLayoutListener, referenced from method com.my.project.ActivityHome.removeLayoutListenerPost16
04-24 09:30:12.565: W/dalvikvm(471): VFY: unable to resolve virtual method 2950: Landroid/view/ViewTreeObserver;.removeOnGlobalLayoutListener (Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V
在我的情况下(见链接问题),我可以解决使用反射
try {
Method m = ViewTreeObserver.class.getMethod("removeOnGlobalLayoutListener", OnGlobalLayoutListener.class);
m.invoke(observer, listener);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
我的问题是:是使用反射和避免警告更好,还是忽略警告避免反射更好?
我的反射代码不捕获异常,但我不确定它是正确的,是吗?
该警告只是一个警告,在执行过程中不会引起任何问题。
使用反射和异常处理测试方法的存在性是代价很高的,应该尽可能避免。
您应该使用Build.VERSION.SDK_INT
常量来检查您实际运行的平台
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
// Do something using Gingerbread API
else {
// Workaround for earlier version of android
}