Java 如果类实现了更新的接口,Android推荐的安全支持更新API的方法就会出错。为什么?
为了支持不同的Api级别,我使用了下面介绍的技术: 以下是文章中的示例:Java 如果类实现了更新的接口,Android推荐的安全支持更新API的方法就会出错。为什么?,java,android,dalvik,Java,Android,Dalvik,为了支持不同的Api级别,我使用了下面介绍的技术: 以下是文章中的示例: public static VersionedGestureDetector newInstance(Context context, OnGestureListener listener) { final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); VersionedGestureDetector detector = nul
public static VersionedGestureDetector newInstance(Context context,
OnGestureListener listener) {
final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
VersionedGestureDetector detector = null;
if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
detector = new CupcakeDetector();
} else if (sdkVersion < Build.VERSION_CODES.FROYO) {
detector = new EclairDetector();
} else {
detector = new FroyoDetector(context);
}
detector.mListener = listener;
return detector;
}
-
-
AnimatorListener仅从3.1版开始提供
现在,如果运行:objectobj=VersionedLoader.newInstance()代码>
此错误将出现在日志中:
10-27 13:51:14.437: I/dalvikvm(7673): Failed resolving Lyour/package/name/NewVersionLoader; interface 7 'Landroid/animation/Animator$AnimatorListener;'
10-27 13:51:14.437: W/dalvikvm(7673): Link of class 'Lyour/package/name/NewVersionLoader;' failed
10-27 13:51:14.445: E/dalvikvm(7673): Could not find class 'your.package.name.NewVersionLoader', referenced from method your.package.name.VersionedLoader.newInstance
10-27 13:51:14.445: W/dalvikvm(7673): VFY: unable to resolve new-instance 1327 (Lyour/package/name/NewVersionLoader;) in Lyour/package/name/VersionedLoader;
10-27 13:51:14.445: D/dalvikvm(7673): VFY: replacing opcode 0x22 at 0x000c
10-27 13:51:14.445: D/dalvikvm(7673): VFY: dead code 0x000e-0011 in Lyour/package/name/VersionedLoader;.newInstance ()Lyour/package/name/VersionedLoader;
它不会崩溃,而且会继续正常工作。是的,我可以重现这个问题。然而,正如您所注意到的,有点令人惊讶的是,它没有崩溃这一事实意味着Dalvik在LogCat中可能有点过于健谈,而不是对应用程序造成伤害
一种解决方法是将接口移动到内部类。在您的示例中,NewVersionLoader
中的内部类将实现AnimationListener
,而不是NewVersionLoader
实现AnimationListener
:
@TargetApi(11)
public class NewVersionLoader extends VersionedLoader {
private class Foo implements AnimatorListener {
@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
}
}
诚然,这可能并不理想,这取决于您对VersionedLoader
的预期用途。但是,由于VersionedLoader
本身没有实现AnimationListener
,因此VersionedLoader
的用户将不会调用AnimationListener
方法,因此,您的逻辑位于内部类而不是实际类上这一事实应该不是一个大问题。“这工作得很完美”--不在Android 1.x上。关于你的界面问题,你想在哪个版本的Android上运行这个代码?(上面的代码不是我正在运行的代码,只是这个方法的示例)。我在2.3设备上看到这个问题。该类实现了android.animation.Animator.AnimatorListener,直到3.2版本才可用。我还没有尝试过2.3版以外的其他版本,真奇怪。如果没有人提出解决方案或解释,我会自己做一些实验。由于一些旅行(也许还有一点飓风)的原因,这将被推迟一点,但我会尽量在太长时间内到达目的地。如果你有一个可以演示这种现象的示例项目,请将源代码发布到某个地方,我会看一看。我会整理一些示例代码。我在上面添加了一些代码,并验证了它也再现了这个问题。因为它实际上并没有崩溃,并且仍然正常工作,所以这更像是一种好奇,而不是一种深切的担忧。祝暴风雨好运!
@TargetApi(11)
public class NewVersionLoader extends VersionedLoader implements AnimatorListener {
@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
}
10-27 13:51:14.437: I/dalvikvm(7673): Failed resolving Lyour/package/name/NewVersionLoader; interface 7 'Landroid/animation/Animator$AnimatorListener;'
10-27 13:51:14.437: W/dalvikvm(7673): Link of class 'Lyour/package/name/NewVersionLoader;' failed
10-27 13:51:14.445: E/dalvikvm(7673): Could not find class 'your.package.name.NewVersionLoader', referenced from method your.package.name.VersionedLoader.newInstance
10-27 13:51:14.445: W/dalvikvm(7673): VFY: unable to resolve new-instance 1327 (Lyour/package/name/NewVersionLoader;) in Lyour/package/name/VersionedLoader;
10-27 13:51:14.445: D/dalvikvm(7673): VFY: replacing opcode 0x22 at 0x000c
10-27 13:51:14.445: D/dalvikvm(7673): VFY: dead code 0x000e-0011 in Lyour/package/name/VersionedLoader;.newInstance ()Lyour/package/name/VersionedLoader;
@TargetApi(11)
public class NewVersionLoader extends VersionedLoader {
private class Foo implements AnimatorListener {
@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
}
}