从Eclipse运行我的应用程序时出现exception

我已经有这个问题近2个月了,无法弄清楚。 问题是,如果我的应用程序正在运行,并且从Eclipse运行(重新安装)我的应用程序,则会收到一条错误消息,指出我的应用程序崩溃了“不幸的是,已经停止”。 我注意到,当我从PC / Eclipse运行它时,它也会发生,我认为只有在我不运行它一段时间后才会发生。

只有当应用程序在第三个活动( BaseDiagramActivity )中处于活动BaseDiagramActivity ,然后从Eclipse再次运行应用程序时才会发生。 除了3个活动,我已经基本上除掉了所有的应用程序,现在还在发生。

我search了这个问题的解决scheme,但找不到任何好的答案或适用于我的。

它似乎不像硬件或Android版本的问题,因为我在我的平板电脑(4.0.3)和我的手机(4.0.2,更新前4.0.1发生)上运行这个问题。 当然,除非是冰淇淋夹心cookies。

让我知道是否有更多的信息是必需的。

例外(Tag = AndroidRuntime)

 FATAL EXCEPTION: main java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException at android.app.LoadedApk.makeApplication(LoadedApk.java:482) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3938) at android.app.ActivityThread.access$1300(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:362) at android.app.LoadedApk.getClassLoader(LoadedApk.java:305) at android.app.LoadedApk.makeApplication(LoadedApk.java:474) ... 11 more 

Android代码

LoadedApk.initializeJavaContextClassLoader() – 第362行似乎是违法者

以下是相关文件:

AndroidManifest.xml中

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="[my package]" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="HomeActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="LoadDiagramActivity" android:label="Load Diagram"></activity> <activity android:name="BaseDiagramActivity" android:label="Base Diagram"></activity> </application> </manifest> 

HomeActivity.java

 public class HomeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); Button diagramButton = (Button)findViewById(R.id.diagram); diagramButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { startActivity(new Intent(HomeActivity.this, LoadDiagramActivity.class)); } }); } } 

LoadDiagramActivity.java

 public class LoadDiagramActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.load_diagram_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.add_new_diagram: startActivity(new Intent(this, BaseDiagramActivity.class)); return true; default: return super.onOptionsItemSelected(item); } } } 

BaseDiagramActivity.java

实际上这并不重要,只要启动了“第三”活动(或单击LoadDiagramActivity上的添加button), LoadDiagramActivity

 public class BaseDiagramActivity extends Activity { } 

home.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/diagram" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Diagram" /> </LinearLayout> 

附加信息

当我为了更简单的回答而剥离我的项目时,我把所有东西都移到了包的名字空间中。 在实际的项目中,有5个命名空间,当我使用精简版进行testing时,它们仍然存在,但是没有被调用(据我所知)。

这里是包:

  • [package] – 一般逻辑
  • [package].activities 。活动 – 所有活动和基地活动
  • [package].database – 与数据库的所有交互
  • [package].models – 保存/加载数据的模型
  • [package].renderables – 绘制到canvas的对象

我试图添加一个`android:sharedUserId'属性到清单,而且它似乎什么都不做我试过。 当我最初调查这个时,我得出的结论是共享用户id只适用于不同的项目,而不是不同的包。

我也不相信当我把所有东西都剥下来的时候,和数据库有任何的交互。 第三项活动可能是任何活动,甚至是“家庭活动”,都是违背这一理论的。

有用的链接

  • stackoverflow:由于NullPointerException,android.app.Application无法实例化
  • GreoCode 4.0.1上的android.app.LoadedApk
  • 可能的竞赛状况?
  • Android问题#25869

2012年11月11日更新

最近几天,我又回到了这个项目中,我在Eclipse Juno中创build了一个全新的项目(之前在Helios上),并且手动传输了所有东西,这样Eclipse和Android工具几乎处理了所有的Manifest交互,但仍然在发生。 在接下来的几天我会再看一下,如果我find任何东西,我会更新。

仅供参考我的新项目针对以下内容:

 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" /> 

新的项目结构现在也包含了根包中的所有活动(即[package],而不是[package] .activities)。 我也使用(new?)语法来显示父活动:

 <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="[my package].LoadDiagramActivity" /> 

在我现在更新的运行Jellybean 4.1.2的Galaxy Nexus上,它也仍然存在。

尝试在Manifest文件中添加一个更多的东西,我相信你已经尝试..

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="[my package]" android:versionCode="1" android:versionName="1.0" android:sharedUserId="com.mj.app" > 

在你的项目中,你似乎有多个包,比如com.package.p1 , com.package.p2 ,com.package.p3 ..

而开始时,你在p1 ,然后移动到p2 - p3 …在那个时候,你尝试再次运行它,所以Android给你错误。

如果你在你的minSdkVersion13 ,它应该可以工作。

要么是,要么在其他活动的onCreate()中设置setDisplayHomeAsUpEnabled(false)

这两个解决scheme应该工作。

根据文档从API级别14开始,默认情况下setHomeButtonEnabled(true)不再为您完成,并且继续说:

设置DISPLAY_HOME_AS_UP显示选项将自动启用主页button。

所以我们可以推断出setDisplayHomeAsUpEnabled(false)工作方式与setHomeButtonEnabled(false)类似,

如果我没有弄错,只有当我们从Eclipse Run-> As重新安装应用程序时才会发生这种情况。 所以当用户通过Play进行升级时,这种情况不太可能发生。 我可以自信地说,因为在通过Eclipse重新安装期间,我注意到我的应用程序也是这个exception,但对Crittercism没有任何意义。

为了解决这个问题,我努力解决我的应用程序的内存消耗。

  1. 如果你只有一套drawable,那么改变它。 创build一个drawables-mdpi并从该1个drawables文件夹(drawables,drawable-ldpi)复制所有文件。 如果你只有一组,Android将调整它的大屏幕使用,从而在内部占用太多的内存,清理这种内存(位图)是容易出错的。 听起来很疯狂,但确实奇迹。 不要相信我,在这个改变之前和之后运行它在堆内存使用情况监视下,你会发现你的应用程序在一个普通的情况下减less了25%的内存。
  2. 如果您正在执行任何位图操作,则可能需要考虑缩小比例。 至less当你设置选项,你一定要缩小它。 点击这里和这里 。 search或缩小比例。
  3. 最后不要忘记bitmap.recycle(); bitmap = null; bitmap.recycle(); bitmap = null; 在你的onDestroy和所有System.exit(0)之前。

Android做了很多后台工作,重新安装是从应用程序的突然清理期望。 未清理的内存可能会导致问题。 这个例外是其中的一个。 所以不要认为这是简单的。

您尚未在manifest的android:name属性中将句号添加到您的活动android:name 。 也许,这会导致问题。

等你的应用程序崩溃后,当你第二次运行它。 应用程序将再次崩溃后启动。 这有时会发生在我身上。 如果在你运行之前,不要忘了每次清理你的项目,那么情况也是如此。

通过检查你的代码,我觉得你正在跳过在LoadDiagramActivity设置"setContentView(rid)" 。 请尝试在onCreate()设置视图。

希望这会帮助你。

你需要追加“。” 在Menifestactivity名称Menifest

喜欢这个

 <?xml version="1.0" encoding="utf-8"?> 
 <uses-sdk android:minSdkVersion="14" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".HomeActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoadDiagramActivity" android:label="Load Diagram"></activity> <activity android:name=".BaseDiagramActivity" android:label="Base Diagram"></activity> </application> 

我更新你的明天的活动。 请检查一下…

目前为止我们提供的代码没有任何问题。 我刚刚在一个包名为com.test的新项目中尝试了它,并且工作完美无瑕。 我在文件中添加的唯一东西是包声明。 (当然,我添加了load_diagram_menu.xml。)

如果可能的话,如果你能让我们访问完整的项目,那将是非常好的。 如果项目在别人的计算机上工作,那么很可能是Eclipse或Android Eclipse插件的行为不当。 一个干净的Eclipse安装将解决这个问题。 (虽然我明白如何离线可以使这个困难。:-))

为此,清洁项目时一定要选中“自动构build”。 (项目 – >自动生成)