2010-01-06 61 views
4

我得到这个错误: “未捕获的处理程序:螺纹主力退出,由于未捕获的异常java.lang.VerifyError的”不能赶上java.lang.VerifyError的

这只是发生在1.6。 Android 2.0及以上版本不存在任何问题,但这是所有的主要观点。

我无法捕捉错误/异常(VerifyError),并且我知道它是由调用isInitialStickyBroadcast()引起的,它在SDK 4中不可用,这就是为什么它包装在SDK检查中。我只需要这个BroadcastReceiver在2.0+上工作,而不是在1.6中打破,这是市场上的一个应用程序,对于2.0+的用户需要UNDOCK功能,但显然不是1.6,但仍有相当数量的用户仍然在1.6上。

如何解决?

谢谢!

private BroadcastReceiver mUndockedReceiver = new BroadcastReceiver() 
{ 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      //FROM ECLAIR FORWARD, BEFORE DONUT THIS INTENT WAS NOT IMPLEMENTED 
      if (Build.VERSION.SDK_INT >= 5) 
      { 
       if (!isInitialStickyBroadcast()) { 
        int dockState = intent.getExtras().getInt("android.intent.extra.DOCK_STATE", 1); 
        if (dockState == 0) 
        { 
         finish(); 
        } 
       } 
      }   
     } 
}; 
+1

这个意图显然只是注册了SDK> = 5 ..并且它在5 ^上正常工作,但没有注册到sdk 4(android 1.6)上。 – velazcod 2010-01-06 15:46:09

+1

,我不需要在1.6注册它...我没有在1.6上注册broadcastreceiver,只在2.0和更高版本上注册。 – velazcod 2010-01-06 15:47:20

回答

4

Intent.EXTRA_DOCK_STATE仅在API级别存在5及以上,所以将仅在Android工作2.0设备(或以上)。

即使您在API级别检查中打包调用,当您在Android 1.6运行时运行时代码也会失败,因此VerifyError也会失败。

解决方法是用其常量值android.intent.extra.DOCK_STATE替换呼叫Intent.EXTRA_DOCK_STATE


作为一般规则,它是浏览API文档时勾选复选框“通过API级过滤器”,它在你的情况设置为4个好主意。这样,Android 1.6不可用的任何类,方法或常量将会变灰。

+0

当然,是有道理的。 但是,我用这个常数值替换它,我仍然得到VerifyError。 intent.getExtras()。getInt(“android.intent.extra.DOCK_STATE”,1); – velazcod 2010-01-06 16:12:58

+0

'isInitialStickyBroadcast()'也只适用于Android 2.0+,所以你可以看看你是否可以没有这个电话。 – 2010-01-06 16:16:53

+1

这是正确的,这就是为什么我把它全部封装在SDK检查中......如果这不可能修复,它会很糟糕。 – velazcod 2010-01-06 16:46:10

0

由于这是一个错误,而不是一个例外,它不会延伸Exception。相反,它会延伸Throwable,所以你必须赶上:

try { 

.... 

} catch (Throwable e) { 
} 
+0

,没有工作,谢谢 – velazcod 2010-01-08 18:00:16

2

我有一个类似的问题,但位图缩放1.5和1.6之间。结束时使用与this blog post中提供的解决方案类似的东西来创建实用程序类,该实用程序类根据API编号切换代码路径。

一件事在这个例子注意,因为它支持1.5它使用android.os.Build.VERSION.SDK它被废弃了,但据戴安娜Hackborn(谷歌工程师)会在将来的SDK版本not be removed。如果你只支持1.6及以上版本,你可以使用android.os.Build.VERSION.SDK_INT,这是不推荐使用的。

此外,由于您的目标是1.6,如果您不是依赖于该版本的框架,您可能也希望看到支持1.5,在撰写本文时1.5是31% of Android devices访问Android Market 。

0

要发现错误,你可以这样做。

try { 

    // write your code here 

    } catch (VerifyError e) { 
     // TODO: handle exception 
    }