这个Bug发生在这样的环境: 你有很多的线程在同时运行,并且每个线程都需要持续运行相当长一些时间; 其中一些是用AsyncTask去作的,并且AsyncTask在其他的线程执行顺序之后。
java.lang.
NoClassDefFoundError: android
.os.AsyncTask
.这里暂时不贴出异常栈信息(出现在uncaughtException),通过大量的search,终于找到一些有营养的资料:
Received: by 10.101.85.19 with SMTP id n19mr4167516anl.30.1314658242480;
Mon, 29 Aug 2011 15:50:42 -0700 (PDT)
X-BeenThere: android
-developers@googlegroups.com
Received: by 10.101.181.21 with SMTP id i21ls13340762anp.4.gmail; Mon, 29 Aug
2011 15:48:59 -0700 (PDT)
Received: by 10.101.24.5 with SMTP id b5mr2043100anj.37.1314658139241;
Mon, 29 Aug 2011 15:48:59 -0700 (PDT)
Received: by 10.151.138.5 with SMTP id q5msybn;
Mon, 29 Aug 2011 10:44:15 -0700 (PDT)
Received: by 10.101.168.1 with SMTP id v1mr728239ano.36.1314639855438;
Mon, 29 Aug 2011 10:44:15 -0700 (PDT)
Date: Mon, 29 Aug 2011 10:44:14 -0700 (PDT)
From: exakoustos <stratouk...@gmail.com>
Reply-To: android
-developers@googlegroups.com
To: android
-developers@googlegroups.com
Message-ID: <28014072.5885.1314639854428.JavaMail.geo-discussion-forums@yqgc10>
In-Reply-To: <3208001.1407.1314283401379.JavaMail.geo-discussion-forums@yqcd38>
References: <0146c2a8-4093-4416-b2c4-d0698109cb95@a12g2000yqi.googlegroups.com>
<CANCScgjEZ1YEHL+R9srFEkoA7wft_s=LzDpcmLnyHWTa_NM2_A@mail.gmail.com> <3abc056a-a09d-4a64-a341-a1064cd988ee@z17g2000vbp.googlegroups.com>
<CALLdnhPdcfScNw7cScT_fcKKSR-S08qjGtbyVTb-JrQjwkbd2g@mail.gmail.com>
<3208001.1407.1314283401379.JavaMail.geo-discussion-forums@yqcd38>
Subject: Re: [android
-developers] Re: java.lang.
NoClassDefFoundError:
android
.os.AsyncTask
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_5883_18950387.1314639854427"
------=_Part_5883_18950387.1314639854427
Content-Type: multipart/alternative;
boundary="----=_Part_5884_488802.1314639854427"
------=_Part_5884_488802.1314639854427
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Was faced with the same error when trying to launch an AsyncTask and found
that the reason it would fail was that an unrelated thread would throw
an unhanded exception early on. It seems the AsyncTask and the other thread
(used to fetch ad banners) shared resources and when the ad thread
misbehaved it made the
class
loader misbehave as well.
Managed to figure this out while reading your post after obsessing for 4
days. Thank you!
------=_Part_5884_488802.1314639854427
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
Was faced with the same error when trying to launch an AsyncTask and found that the reason it would fail was that an unrelated thread would throw an unhanded exception early on. It seems the AsyncTask and the other thread (used to fetch ad banners) shared resources and when the ad thread misbehaved it made the class
loader misbehave as well.<div><br></div><div>Managed to figure this out while reading your post after obsessing for 4 days. Thank you!</div>
------=_Part_5884_488802.1314639854427--
------=_Part_5883_18950387.1314639854427--
上面的东西还能大致看懂: 由于其他线程和AsyncTask在装载时都在竞争相同的资源,导致AsyncTask竞争失败,进一步导致class loader装载它失败。
怎么会这样呢, 想不通?!
查看源代码 http://www.oschina.net/code/explore/android-2.2-froyo/android/os/AsyncTask.java
Line 184: Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
再看: http://www.oschina.net/code/explore/android-2.2-froyo/android/os/Process.java
Line 126: public
static
final
int
THREAD_PRIORITY_LOWEST =
19
;
Line 136: public
static
final
int
THREAD_PRIORITY_BACKGROUND =
10
;
看完后真的感到无可奈何! 调整线程优先级看来没辙了。
继续奇想: 让class loader优先装载它如何?! 了解过class loader就知道(Class.forName): 如果一个class被装载过一次,以后就不会再出先类似:
java.lang.
NoClassDefFoundError
.
到此,问题就解决了。 直接在Application#onCreate里靠前面的位置执行一个空的AsyncTask实例就解决问题。
如果你能确保你自己的线程顺序,把AsyncTask放在当前Activity里的其他线程之前也可以。但是没有上面的方法保险。
终于松了口气! 也真明白了线程优先级的危害。
分享到:
相关推荐
在Java编程中,`java.lang.ClassNotFoundException` 是一个常见的运行时异常,通常发生在尝试通过类加载器加载指定类时,但找不到对应的字节码文件。在这个特定的问题中,`ClassNotFoundException` 引发的原因是缺少...
在Android开发过程中,有时会遇到一个常见的运行时异常——`java.lang.NoClassDefFoundError`。这个错误通常意味着在编译期间能够找到类的定义,但在运行时却无法加载该类。本文将深入探讨这个问题,特别是在Android...
标题 "java.lang.NoClassDefFoundError: javax/persistence/EntityListener" 提到的问题是一个常见的Java运行时异常,通常表示在类加载时找不到指定的类定义。这个错误在Java应用程序或Web应用中出现,可能是因为...
该jar包解决报错java.lang.NoClassDefFoundError: org/apache/james/mime4j/MimeException,亲测可用。
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理
包含3个jar(修改后的javaee.jar可以接覆盖原jar,和mail.jar和activition.jar)和一个文档,测试通过。 JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 原因: MyEclipse...
java.lang.NoClassDefFoundError: de/javakaffee/kryoserializers/CurrencySerializer
在Android开发过程中,有时会遇到一个令人困惑的错误——`java.lang.NoClassDefFoundError`。这个错误通常意味着在运行时找不到某个类的定义,即使编译时该类是可用的。在本例中,问题出在一个特定的情景:在Android...
在Java编程中,`java.lang.NoClassDefFoundError` 是一个常见的运行时错误,它发生在类加载器尝试执行一个类,但在类路径中找不到该类的定义时。在这个特定的场景中,问题聚焦于 `net.sf.ezmorph.Morpher` 类。`...
4. **java.lang.NoClassDefFoundError- javax-servlet-jsp-jstl-core-Config - CSDN博客.url**:这个URL指向一个CSDN博客文章,很可能提供了关于如何解决特定`NoClassDefFoundError`的详细步骤,特别是与`javax....
标题中的“JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决”指的是一类常见的Java运行时错误,当尝试加载一个类时,如果Java虚拟机(JVM)找不到该类的定义,就会抛出`...
在jsp运行过程中,报错 java.lang.NoClassDefFoundError org.apache.xml.serializer.TreeWalker时的处理方法。
Caused by: java.lang.NoClassDefFoundError: com.sun.org.apache.xml.internal.resolver.CatalogManager at com.sun.xml.ws.util.xml.XmlUtil.createEntityResolver(XmlUtil.java:266) at org.jvnet.jax_ws_...
在Java开发环境中,我们经常会遇到`java.lang.NoClassDefFoundError`这个异常,这是一个运行时错误,通常发生在尝试执行一个包含对某个类的引用,但系统无法找到该类的定义时。在这个特定的问题中,错误涉及到`org....
标题中的“java.lang.NoClassDefFoundError: javax/tools/StandardJavaFile”是一个常见的Java运行时错误,它表示在类路径中找不到某个类的定义。这个错误通常发生在试图执行包含特定类的代码,但该类在运行时环境中...
4. 因为NoClassDefFoundError是java.lang.LinkageError的一个子类,所以可能由于程序依赖的原生的类库不可用而导致 5. 检查日志文件中是否有java.lang.ExceptionInInitializerError这样的错误 与...
在Java编程中,`java.lang.NoClassDefFoundError` 是一个常见的运行时异常,它发生在类加载器尝试加载一个在编译时存在但在运行时找不到的类定义时。这个错误通常意味着类路径设置不正确或者依赖项没有正确地被包含...
在Java编程中,`ClassNotFoundException` 是一个常见的运行时异常,表示尝试加载某个类时,在类路径中找不到对应的`.class`文件。在这个特定的场景中,异常堆栈跟踪显示 `Caused by: java.lang....
Java编程中的`java.lang.NoClassDefFoundError: org/jboss/logging/`是一个常见的运行时错误,通常发生在尝试执行一个类时,JVM无法找到在编译时已经存在的类定义。这个错误并不意味着类在编译期间不存在,而是表明...