2013-04-24 41 views
0

我想扩展我的previous question调用未来API提供的方法

如果在我的代码有一个由未来的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(); 
} 

我的问题是:最好是使用反射和避免警告,或者我最好忽略避免反射的警告?

我的反射代码没有捕获异常,但我不确定它是否正确,是吗?

+1

我会去思考哪个平台。什么是“我的反思代码没有捕获异常,但我不确定它是否正确,是吗?”意思 ?你正在捕捉错误,但你没有管理它 – Blackbelt 2013-04-24 13:33:06

+0

这意味着它是我第一次使用反射,并且我没有找到方法“removeOnGlobalLayoutListener”的例子,所以我尝试了解它是如何工作的,并且经过了很多捕获异常的尝试我找到“似乎”可以工作的发布代码。我问的是代码是否正确 – crbin1 2013-04-24 13:38:01

+0

是的它是...... – Blackbelt 2013-04-24 13:39:23

回答

0

该警告只是一个警告,在执行过程中不会引起任何问题。

使用反射和异常处理测试方法的存在是昂贵的并应尽可能避免。

您应该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 
} 
+0

是的,我检查版本,你可以在这里看到完整的代码http://stackoverflow.com/questions/16189525/ongloballayoutlistener-deprecation-and-compatibility 。没有检查,我自然有一个检查错误,我只有一个警告。我试图理解如果警告或多或少比反射昂贵 – crbin1 2013-04-24 13:46:17

+0

我编辑了我的答案,以更好地回答你的问题。事实上,ActionBarSherlock(一个众所周知的android库)显示了相同的警告,这被认为是可以接受的。请参阅https://github.com/JakeWharton/ActionBarSherlock/issues/366以供参考。 – nicopico 2013-04-24 13:52:03

相关问题