Исключение при запуске приложения из Eclipse

У меня эта проблема уже почти 2 месяца и не могу понять. Проблема в том, что если мое приложение запущено и я запустил (переустановил) мое приложение из Eclipse, я получаю сообщение об ошибке, указывающее, что мое приложение разбилось "К сожалению, остановилось". Я замечаю, что это также происходит, когда я убегаю от своего ПК /Eclipse, я думаю, что это происходит только после того, как я не запускаю его некоторое время.

Это происходит только в том случае, если приложение активно в третьем действии (BaseDiagramActivity), а затем снова запускаю приложение из Eclipse. Я удалил в основном все приложения, кроме трех видов деятельности, и это все еще происходит.

Я искал и искал решение этой проблемы, но не могу найти хороший ответ или тот, который применим ко мне.

Это не похоже на проблему с аппаратной или андроидной версией, так как я запускаю ее на своем планшете (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 'в манифест, и, похоже, я ничего не делал в обоих случаях. Когда я первоначально изучал это, я пришел к выводу, что идентификатор общего пользователя применяется только к различным проектам, а не к различным пакетам.

Кроме того, я не думаю, что было какое-то взаимодействие с базой данных, когда я все лишился. Тот факт, что 3-я деятельность может быть любой деятельностью, даже HomeActivity, была чем-то против этой теории.

Полезные ссылки

Обновление 1/11/2012

Последние пару дней назад я вернулся в этот проект, я создал совершенно новый проект в Eclipse Juno (ранее был на Helios) и передал все вручную, чтобы инструменты Eclipse и Android обрабатывали практически все взаимодействия Manifest, но он все еще происходит. Я посмотрю на это немного больше в течение следующих нескольких дней и обновляю, если найду что-нибудь.

FYI мой новый проект нацелен на следующее:

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

Новая структура проекта также имеет все действия в корневом пакете (т.е. [package], а не [package].activities). Я также использую синтаксис (новый?), Чтобы показать родительскую активность:

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

Он также по-прежнему происходит на моем обновленном Galaxy Nexus, на котором работает Jellybean 4.1.2.

Ответ 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 дает вам ошибку.

Ответ 2

Если вы положили 13 в свой minSdkVersion, он должен работать.

Либо это, либо вам нужно setDisplayHomeAsUpEnabled(false) в onCreate() других ваших действий.

Оба эти решения должны работать.

Начиная с уровня API 14 в соответствии с документацией, setHomeButtonEnabled(true) больше не выполняется для вас по умолчанию, и он переходит к скажем, что

Настройка опции отображения DISPLAY_HOME_AS_UP автоматически активирует домашнюю кнопку.

Итак, мы можем заключить, что setDisplayHomeAsUpEnabled(false) работает аналогично setHomeButtonEnabled(false)

Ответ 3

Если я не ошибаюсь, это происходит только при переустановке приложения из Eclipse Run- > As. Таким образом, это вряд ли произойдет, когда пользователь обновится через Play. Я могу сказать это с уверенностью, так как я заметил свое приложение тоже с этим исключением во время переустановки через Eclipse, но ничего не было в Crittercism.

Чтобы исправить это, я работал над решением проблемы потребления памяти в моем приложении.

  • Если у вас есть только один набор чертежей, измените это. Создайте drawables-mdpi и скопируйте весь файл из этой папки 1 drawables (drawables, drawable-ldpi). Если у вас всего 1 комплект, Android изменит его размер для использования на больших экранах, тем самым внутренне занимая слишком много памяти, а очистка такого вида памяти (растрового изображения) будет подвержена ошибкам. Звучит безумно, но творит чудеса. Не верьте мне, запустите его под часами использования памяти кучи до и после этого изменения, вы заметите, что ваше приложение занимает на 25% меньше памяти для общего сценария.
  • Если вы выполняете какие-либо операции Bitmap, вы можете рассмотреть возможность уменьшения масштаба. По крайней мере, когда вы устанавливаете параметры, вы определенно хотите уменьшить масштаб. Здесь здесь и здесь. Поиск или уменьшение масштаба.
  • Наконец, не забудьте bitmap.recycle(); bitmap = null; в вашем onDestroy и перед всеми System.exit(0).

Android делает много фоновой работы, а переустановка - это внезапное ожидание от приложения. Невозможно очистить память. Это исключение является одним из тех internal. Поэтому не думайте, что это просто.

Ответ 4

Вы не добавили период к именам своих действий в манифесте android:name. Возможно, это вызывает проблему.

Ответ 5

Подождите, когда ваше приложение выйдет из строя, когда вы запустите его во второй раз. Приложение снова запустится после сбоя. Иногда это случается со мной. Если это то же самое происходит, если вы не забыли очистить свой проект каждый раз, прежде чем запускать его.

Ответ 6

Проверяя свой код, я чувствую, что вы пропускаете, чтобы установить "setContentView(rid)" в LoadDiagramActivity. Попробуйте установить представление в onCreate().

Надеюсь, это поможет вам.

Ответ 7

Вам нужно добавить "." перед именем 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>

Я обновляю вашу манифестацию. Пожалуйста, проверьте это...

Ответ 8

Нет ничего плохого в коде, который вы нам дали. Я просто попробовал его в новом проекте с именем пакета com.test, и он работал безупречно. Единственное, что я добавил в файлы, это объявление пакета. (И я добавил load_diagram_menu.xml, конечно.)

Если возможно, было бы здорово, если бы вы могли предоставить нам доступ к полному проекту. Если проект работает на другом компьютере, скорее всего, Eclipse или плагин Android Eclipse, который плохо себя ведет. Чистая установка Eclipse решит это. (Хотя я понимаю, как быть в автономном режиме может сделать это сложно.:-))

Ответ 9

Для этого обязательно проверяйте "Build Automatically" при очистке проекта. (Project → Build Automatically)