繁体   English   中英

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

[英]Exception when I run my application from Eclipse

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

只有当应用程序在第3个活动( BaseDiagramActivity )中处于活动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上的添加按钮)就会发生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" />

它仍然出现在我现在更新的运行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会给你错误。

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

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

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

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

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

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

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

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

  1. 如果您只有一组drawable,那么改变它。 创建drawables-mdpi并从该1个drawables文件夹(drawables,drawable-ldpi)复制所有文件。 如果你只有一套,Android会调整它的大小,因为它在更大的屏幕上使用,因此在内部占用太多的内存,并且这种内存(位图)的清理很容易出错。 声音疯狂,但确实奇迹。 不要相信我,在此更改之前和之后的堆内存使用情况下运行它,您会注意到您的应用程序的内存减少了25%。
  2. 如果您正在执行任何位图操作,您可能需要考虑降尺度。 至少在您设置选项时,您肯定希望缩减它。 点击这里这里 搜索或缩小范围。
  3. 最后别忘了bitmap.recycle(); bitmap = null; bitmap.recycle(); bitmap = null; 在你的onDestroy和所有System.exit(0)之前。

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

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

通过检查您的代码,我觉得您正在跳过在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>

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

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

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

为此,请确保在清理项目时选中“自动构建”。 (项目 - >自动构建)

您还没有在manifest的android:name属性中将句点添加到您的活动android:name 也许,这会导致问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM