42 votes

Exception lorsque j'exécute mon application à partir d'Eclipse

J'ai eu ce problème pendant près de 2 mois maintenant et ne peut pas le comprendre. Le problème est que, si ma demande est en cours d'exécution et je lance (réinstaller) ma demande d'Eclipse, je reçois un message d'erreur m'indiquant que ma demande a s'est écrasé " Malheureusement, a arrêté.'. Je remarque qu'il se produit également quand je le lance loin de mon PC/Eclipse, je pense qu'il se produit seulement après je n'ai pas l'exécuter pendant un certain temps.

Il se produit uniquement si l'application est active dans la 3ème activité (BaseDiagramActivity) puis-je exécuter l'application à partir d'Eclipse. J'ai dépouillé essentiellement toutes les applications, sauf les 3 activités et Il est encore en cours.

J'ai cherché et cherché une solution à ce problème, mais ne peut pas trouver une bonne réponse ou celle qui s'applique à moi.

Il ne semble pas comme un matériel ou une version android question que je suis sur ce sur ma tablette (4.0.3) et mon téléphone (4.0.2, qui se passait avant la mise à jour 4.0.1). Sauf si bien sûr c'est un sandwich à la crème glacée bug.

Laissez-moi savoir si d'info plus est nécessaire.

L'exception (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

Le Code Android

LoadedApk.initializeJavaContextClassLoader() de la Ligne de 362 semble être le délinquant

Ci-dessous sont les fichiers concernés:

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

il ne fait pas d'importance ce que cette activité est, l'exception se produit aussi longtemps qu'un tiers de l'activité est lancé (ou en cliquant sur le bouton ajouter sur 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>

Des informations supplémentaires

Quand j'ai démonté mon projet afin de demander une simple réponse, j'ai tout déplacé dans le paquet de l'espace de noms. Dans le projet il y a 5 espaces de noms, ils étaient toujours présents quand j'ai été le tester avec la version dépouillée cependant tout simplement pas appelé (comme ce que j'ai pu voir).

Voici les paquets:

  • [package] - logique générale
  • [package].activities - toutes les activités et les activités de base
  • [package].database - toutes les interactions avec la base de données
  • [package].models - modèles pour la sauvegarde/chargement de données
  • [package].renderables - objets dessinés pour une toile

J'ai essayé d'ajouter un "android:sharedUserId" attribut le manifeste et et il semblait ne rien les deux fois j'ai essayé. Lorsque j'ai commencé à enquêter sur ce que je suis venu à la conclusion que le partage des id d'utilisateur seulement appliquée à différents projets, pas de paquets différents.

Aussi je ne crois pas qu'il n'y a aucune interaction avec la base de données quand j'ai dépouillé tout bas. Le fait que la 3ème activité pourrait être n'importe quelle activité, même HomeActivity, c'était quelque chose à l'encontre de cette théorie.

Liens utiles

Mise à jour 1/11/2012

Depuis quelques jours, j'ai sauté en arrière dans ce projet, j'ai créé un nouveau projet dans Eclipse Juno (était sur Helios avant) et transféré tout à la main, de sorte que Eclipse et Android outils gérés presque tous le Manifeste de l'interaction, mais il est encore en cours. Je vais regarder ça un peu plus dans les prochains jours et la mise à jour si je trouve quoi que ce soit.

Pour info mon nouveau projet est de cibler les suivantes:

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

La nouvelle structure de projet a également toutes les activités dans le package racine maintenant (c'est à dire. [package], pas [package].les activités). Je suis également en utilisant le (nouveau?) la syntaxe pour afficher l'activité parent:

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

Il est également toujours en cours sur mon maintenant mis à jour Galaxy Nexus exécutant Jellybean 4.1.2.

9voto

MKJParekh Points 18108

Essayez d’ajouter une chose dans le fichier manifeste, je suis sûr que vous avez déjà essayé.

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

Il semble que dans votre projet, vous avez plusieurs PACKAGES, comme com.package.p1 , com.package.p2 ,com.package.p3 ..

Et tout en démarrant, vous êtes dans p1 , puis vous passez à p2 - p3 ... et à ce moment-là, vous essayez de le réexécuter. Ainsi, Android vous donne une erreur.

2voto

Stephan Branczyk Points 5322

Si vous mettez de l' 13 votre minSdkVersion, il devrait fonctionner.

Soit ça, ou vous avez besoin d' setDisplayHomeAsUpEnabled(false) dans la onCreate() de vos autres activités.

Ces deux solutions doivent travailler.

Départ à l'API de Niveau 14 selon la documentation, l' setHomeButtonEnabled(true) n'est plus fait pour vous par défaut, et il continue à dire qu'

Réglage de la DISPLAY_HOME_AS_UP option d'affichage sera automatiquement activer le bouton d'accueil.

On peut donc en déduire qu' setDisplayHomeAsUpEnabled(false) fonctionne d'une manière similaire setHomeButtonEnabled(false)

2voto

Siddharth Points 3828

Si je ne me trompe pas, cela se produit uniquement lorsque nous réinstaller l'application à partir d'Eclipse Exécuter->Comme. Donc, il est peu probable de se produire lorsqu'un utilisateur des mises à niveau par le Jeu. Je peux dire avec assurance, car j'ai remarqué que mon application trop avec cette exception au cours de réinstaller via Eclipse, mais rien sur Crittercism.

Pour remédier à cela, j'ai travaillé sur la résolution de la consommation de mémoire de mon application.

  1. Si vous avez seulement 1 jeu de un drawable, puis le changer. Créer un un drawable-mdpi et de copier tous les fichiers de que 1 un drawable dossier (un drawable, drawable-ldpi). Si vous avez seulement 1 jeu, Android va la redimensionner pour son utilisation sur de plus grands écrans, donc en interne, de prendre trop de mémoire, et le nettoyage de ce type de mémoire (bitmap) est bug sur le ventre. Sembler fou, mais il fait des merveilles. Ne croyez-moi, passer sous un Tas de l'utilisation de la mémoire de la montre avant et après ce changement, vous remarquerez que votre application est 25% moins de mémoire pour un scénario commun.
  2. Si vous faites n'importe quel Bitmap opérations, vous pourriez envisager de downscaling. Atleast lorsque vous définissez des options que vous voulez certainement à la baisse il. Vérifiez ici et ici. La recherche ou de l'downscaleing.
  3. Enfin, n'oubliez pas d' bitmap.recycle(); bitmap = null; dans votre onDestroy et avant tout le Système.exit(0).

Android fait beaucoup de travail de fond, et de la réinstallation est une brusque nettoyage de l'attente de l'application. La mémoire ne sont pas nettoyés peuvent causer des problèmes. Cette exception est l'un de ceux - internal ceux. Afin de ne pas penser à être simple.

0voto

Ajay Kumar Meher Points 1109

En inspectant votre code, je sens que vous omettez de définir "setContentView(rid)" en LoadDiagramActivity . Essayez de définir la vue en onCreate() .

J'espère que ceci vous aidera.

0voto

V.J. Points 2850

Vous devez ajouter "." avant le nom activity en Menifest .

Comme ça

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

Je met à jour l'activité de votre menifest. S'il te plaît vérifie le...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X