web-dev-qa-db-ja.com

Eclipseからアプリケーションを実行すると例外が発生する

私はこの問題を2か月近く抱えていますが、理解できません。問題は、アプリケーションが実行されていて、Eclipseからアプリケーションを実行(再インストール)すると、アプリケーションがクラッシュしたことを示すエラーメッセージが表示されることです。「残念ながら、停止しました。」 PC/Eclipseから実行した場合にも発生することに気付きましたが、しばらく実行しなかった場合にのみ発生すると思います。

これは、アプリが3番目のアクティビティ(BaseDiagramActivity)でアクティブであり、Eclipseからアプリを再度実行した場合にのみ発生します。私は基本的に3つのアクティビティを除くすべてのアプリケーションを削除しましたが、それはまだ発生しています。

私はこの問題の解決策を探して探しましたが、良い答えや私に当てはまるものが見つかりません。

タブレット(4.0.3)と電話(4.0.2、以前は4.0.1で発生していました)でこれを実行しているため、ハードウェアまたはAndroidバージョンの問題のようには見えません更新)もちろん、それがアイスクリームサンドイッチのバグでない限り。

さらに情報が必要な場合はお知らせください。

例外(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

これが実際にどのアクティビティであるかは関係ありません。例外は、「3番目の」アクティビティが開始される(または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は異なるプロジェクトにのみ適用され、異なるパッケージには適用されないという結論に達しました。

また、すべてを取り除いたときにデータベースとの相互作用があったとは思わない。 3番目のアクティビティがHomeActivityであっても、任意のアクティビティである可能性があるという事実は、この理論に反するものでした。

便利なリンク

2012年1月11日更新

この数日間、このプロジェクトに戻って、Eclipse Junoで新しいプロジェクトを作成し(以前はHeliosにありました)、EclipseとAndroidツールがほぼ処理されるようにすべてを手動で転送しました)マニフェストのすべてのインタラクションですが、まだ発生しています。今後数日間でもう少し詳しく調べ、何か見つかった場合は更新します。

参考までに、私の新しいプロジェクトは以下を対象としています。

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

新しいプロジェクト構造には、ルートパッケージ内のすべてのアクティビティも含まれています(つまり、[package] .activitiesではなく[package])。また、(新しい?)構文を使用して親アクティビティを表示しています:

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

これは、Jellybean4.1.2を実行している現在更新されているGalaxyNexusでも引き続き発生しています。

42
Daniel Imms

マニフェストファイルにもう1つ追加してみてください。すでに試していると思いますが、.

<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エラー。

9
MKJParekh

私が間違っていない場合、これはEclipse Run-> Asからアプリを再インストールしたときにのみ発生します。したがって、ユーザーがPlayを介してアップグレードするときに、これが発生する可能性はほとんどありません。 Eclipseを介した再インストール中にこの例外を除いてアプリにも気付いたので、自信を持ってこれを言うことができますが、Crittercismについては何もありません。

これを修正するために、アプリのメモリ消費の解決に取り組みました。

  1. ドローアブルが1セットしかない場合は、それを変更します。 drawables-mdpiを作成し、その1つのdrawablesフォルダー(drawables、drawable-ldpi)からすべてのファイルをコピーします。セットが1つしかない場合、Androidは、より大きな画面で使用できるようにサイズを変更するため、内部で大量のメモリを消費し、この種のメモリ(ビットマップ)のクリーンアップはバグが発生しやすくなります。クレイジーですが、不思議に思います。信じないでください。この変更の前後にヒープメモリ使用量ウォッチで実行すると、一般的なシナリオでアプリが使用するメモリが25%少なくなることがわかります。
  2. ビットマップ操作を実行している場合は、ダウンスケーリングを検討することをお勧めします。少なくともオプションを設定するときは、間違いなくそれを縮小したいと思うでしょう。 ここここ を確認してください。検索またはダウンスケール。
  3. 最後に、onDestroyですべてのSystem.exit(0)の前にbitmap.recycle(); bitmap = null;を忘れないでください。

Androidは多くのバックグラウンド作業を行い、再インストールはアプリからの突然のクリーンアップの期待です。クリーンアップされていないメモリは問題を引き起こす可能性があります。この例外は、それらのinternalの例外の1つです。ですから、それが単純だとは思わないでください。

2
Siddharth

minSdkVersionに_13_を入れると、機能するはずです。

それか、他のアクティビティのsetDisplayHomeAsUpEnabled(false)onCreate()する必要があります。

これらのソリューションは両方とも機能するはずです。

documentation によるとAPIレベル14から、setHomeButtonEnabled(true)はデフォルトで実行されなくなり、さらに次のようになります。

DISPLAY_HOME_AS_UP表示オプションを設定すると、ホームボタンが自動的に有効になります。

したがって、setDisplayHomeAsUpEnabled(false)setHomeButtonEnabled(false)と同じように機能すると推測できます。

2

アプリケーションを2回実行するときに、アプリケーションがクラッシュするまで待ちます。再びクラッシュした後、アプリが起動します。これは時々私に起こります。同じことがuの場合でも、実行する前に毎回プロジェクトをクリーンアップすることを忘れないでください。

0
Chandrashekhar

コードを調べると、LoadDiagramActivity"setContentView(rid)"を設定するのをスキップしているように感じます。 onCreate()でビューを設定してみてください。

これがお役に立てば幸いです。

0

このため、プロジェクトをクリーンアップするときは、必ず「自動ビルド」をチェックしてください。 (プロジェクト->自動ビルド)

0
David Quesada

これまでに提供してくれたコードに問題はありません。パッケージ名com.testの新しいプロジェクトで試してみたところ、問題なく動作しました。私がファイルに追加したのはパッケージ宣言だけでした。 (もちろん、load_diagram_menu.xmlを追加しました。)

可能であれば、プロジェクト全体へのアクセスを提供していただければ幸いです。プロジェクトが他の誰かのコンピューターで動作している場合は、EclipseまたはAndroid Eclipseプラグイン-誤動作している可能性があります。Eclipseをクリーンインストールすると解決します(オフラインの方法は理解していますが)これを難しくする可能性があります。:-))

0
Albin

「。」を追加する必要があります。 activityMenifest名の前。

このような

<?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>

私はあなたのメニフェストの活動を更新します。これをチェックしてください...

0
V.J.

マニフェストのアクティビティの名前にピリオドを追加していません Android:name 属性。おそらく、これが問題の原因です。

0
a.ch.