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

时间:2012-03-17 00:20:50

标签: android eclipse android-intent android-4.0-ice-cream-sandwich

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

仅当应用程序在第3个活动(BaseDiagramActivity)中处于活动状态,然后我再次从Eclipse运行应用程序时才会出现此情况。除了3个活动之外,我基本上已经删除了所有应用程序,而且它仍在发生。

我搜索并搜索了这个问题的解决方案,但找不到任何合适的答案或适用于我的答案。

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

如果需要更多信息,请告诉我。

异常(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上的添加按钮,就会发生异常。

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个名称空间,当我使用精简版本进行测试时它们仍然存在但是没有被调用(据我所见)。

以下是包裹:

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

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

当我剥离所有内容时,我也不相信与数据库有任何交互。事实上,第三项活动可能是任何活动,甚至是HomeActivity,都是违反这一理论的。

有用的链接

2012年1月11日更新

最近几天我又回到了这个项目,我在Eclipse Juno中创建了一个全新的项目(之前是在Helios上)并且手动转移所有内容,以便Eclipse和Android工具几乎处理所有Manifest交互但是它还在发生。我会在接下来的几天里再看一下,如果发现任何事情我会更新。

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

<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" />

我现在更新的Galaxy Nexus仍在运行Jellybean 4.1.2。

9 个答案:

答案 0 :(得分:9)

尝试在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会给你错误。

答案 1 :(得分:2)

如果您将13放在minSdkVersion中,它应该有效。

要么是这样,要么你需要在setDisplayHomeAsUpEnabled(false)的其他活动中onCreate()

这些解决方案都应该有效。

根据documentation从API级别14开始,默认情况下不再为您执行setHomeButtonEnabled(true),并继续说明

  

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

因此,我们可以推断setDisplayHomeAsUpEnabled(false)的工作方式与setHomeButtonEnabled(false)

类似

答案 2 :(得分:2)

如果我没有记错的话,只有当我们从Eclipse Run-&gt; As重新安装应用程序时才会发生这种情况。因此,当用户通过Play升级时,这不太可能发生。我可以自信地说这个,因为在通过Eclipse重新安装期间我确实注意到我的应用程序这个例外,但在Crittercism上没有任何内容。

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

  1. 如果您只有一套drawable,那么改变它。创建drawables-mdpi并从该1个drawables文件夹(drawables,drawable-ldpi)复制所有文件。如果你只有一套,Android会调整它的大小,因为它在更大的屏幕上使用,因此在内部占用太多的内存,并且这种内存(位图)的清理很容易出错。声音疯狂,但确实奇迹。不要相信我,在此更改之前和之后的堆内存使用情况监视下运行它,您会注意到您的应用程序为常见方案减少了25%的内存。
  2. 如果您正在执行任何位图操作,您可能需要考虑降尺度。至少在您设置选项时,您肯定希望缩减它。检查herehere。搜索或缩小范围。
  3. 最后不要忘记你的onDestroy中bitmap.recycle(); bitmap = null;以及所有System.exit(0)之前。
  4. Android做了很多后台工作,重新安装是应用程序的突然清理期望。内存未清理可能会导致问题。此例外是internal个例外之一。所以不要认为它是直截了当的。

答案 3 :(得分:0)

您尚未在清单android:name属性中将活动名称添加到活动名称中。也许,这会导致问题。

答案 4 :(得分:0)

等待第二次运行应用程序崩溃后等待。应用程序将在崩溃后再次启动。这有时发生在我身上。如果情况与此相同,请不要忘记在每次运行之前清理项目。

答案 5 :(得分:0)

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

希望这会对你有所帮助。

答案 6 :(得分:0)

你需要追加“。”在activity中的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>

我更新你的menifest的活动。请检查一下......

答案 7 :(得分:0)

到目前为止,您提供给我们的代码没有任何问题。我刚刚在一个名为com.test的软件包的新项目中尝试过,它运行得很完美。我在文件中添加的唯一内容是包声明。 (当然,我添加了load_diagram_menu.xml。)

如果可能的话,如果您能让我们访问完整的项目,那就太棒了。如果项目正在其他人的计算机上工作,那么Eclipse或Android Eclipse插件很可能是行为不端的。干净的Eclipse安装可以解决这个问题。 (虽然我知道如何离线会让这很困难。:-))

答案 8 :(得分:0)

为此,请务必进行&#34;自动构建&#34;清洁项目时检查。 (项目 - &gt;自动构建)