Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果类实现了更新的接口,Android推荐的安全支持更新API的方法就会出错。为什么?_Java_Android_Dalvik - Fatal编程技术网

Java 如果类实现了更新的接口,Android推荐的安全支持更新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

为了支持不同的Api级别,我使用了下面介绍的技术:

以下是文章中的示例:

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

    }
}