2012-01-27 22 views
12

Soy un tipo novato en el mundo de Android, y estoy haciendo un proyecto de mascota para hacer ejercicio. Es una aplicación similar a un recordatorio muy simple con solo dos actividades. Uno es un ListView personalizado que muestra las alarmas existentes. Hay algunos botones para iniciar el otro, que es para agregar/editar alarmas. Hay un botón que lleva a la actividad anterior ListView.android.app.Application no se puede crear una instancia debido a NullPointerException

Hay una situación extraña con la que me encontré recientemente. Mi aplicación funciona bien Pero el problema es que cada vez que activé la actividad de agregar/editar, volví al ListView y volví a ejecutar (¿o debería volver a instalar?) La aplicación. Aparecerá un mensaje de error. Pero solo aparecerá brevemente y la aplicación comenzará.

El mensaje de error que cogí en el registro dice:

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:3909) 
at android.app.ActivityThread.access$1300(ActivityThread.java:122) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4340) 
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 

No explícitamente señalar dónde está equivocada en mis códigos. Entonces no tengo ni idea de cómo corregirlo. ¿Alguien se encontró con un problema similar? ¡Cualquier sugerencia será apreciada!

Aquí está códigos de actividad Añadir/editar:

public class EditEntry extends Activity 
{ 
    private AutoCompleteTextView foodNameTextView; 
    private DatePicker datePicker; 
    // store values in AutoCompleteTextView & DatePicker 
    private String foodName; 
    private Calendar foodDate; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.edit); 
     // dummy selections for AutoCompleteTextView 
     String[] foodList = new String[]{"meat", "fruit", "vega"}; 
     // instantiate AutoCompleteTextView & DatePicker 
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.food_list_dropdown, foodList); 
     foodNameTextView = (AutoCompleteTextView)findViewById(R.id.foodName); 
     foodNameTextView.setAdapter(arrayAdapter); 
     datePicker = (DatePicker)findViewById(R.id.date_picker); 
     // get intent from ReminderList. 
     Intent intent = getIntent(); 
     // get extras from intent. Return null if intent is sent from "add" action. 
     foodName = intent.getStringExtra("foodName"); 
     foodDate = (Calendar) intent.getSerializableExtra("foodDate"); 
     // set default values for widgets if it is an "edit" action. 
     if (null != foodName) 
     { 
      foodNameTextView.setText(foodName); 
      datePicker.init(foodDate.get(Calendar.YEAR), foodDate.get(Calendar.MONTH), foodDate.get(Calendar.DAY_OF_MONTH), 
        new OnDateChangedListener() 
        { // will implement date input check later. 
         @Override 
         public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {} 
        }); 
     } 

     // Submit will add/modify the data in xml file. Back will start ReminderList activity 
     Button submit = (Button)findViewById(R.id.entry_submit); 
     Button back = (Button)findViewById(R.id.entry_back); 

     submit.setOnClickListener(new SubmitButtonListener()); 
     back.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Intent intent = new Intent(); 
       intent.setClass(EditEntry.this, FoodReminderList.class); 
       startActivity(intent); 
      } 
     }); 
    } 

    // add or modify data in xml file 
    @SuppressWarnings("unused") 
    class SubmitButtonListener implements OnClickListener 
    { 
     Calendar foodDate = Calendar.getInstance(); 

     @Override 
     public void onClick(View v) 
     { 
      XmlUtil xmlUtil = new XmlUtil(); 
      // determine if it is an "edit" action. 
      if (null != foodName) 
      { 
       FoodInfo foodInfo = new FoodInfo(foodName, foodDate); 
       // delete the old data entry 
       xmlUtil.deleteEntry(foodInfo); 
       // cancel old alarm 
       FoodReceiver alarm = new FoodReceiver(EditEntry.this, foodDate, false); 
      } 
      // get new input values 
      foodName = foodNameTextView.getText().toString(); 
      foodDate.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), 0, 0, 0); 
      // update xml file 
      FoodInfo foodInfo = new FoodInfo(foodName, foodDate); 
      xmlUtil.updateEntry(foodInfo); 
      // set new alarm 
      FoodReceiver alarm = new FoodReceiver(EditEntry.this, foodDate, true); 
      // popup toast confirming the submit 
      Toast.makeText(EditEntry.this, "Reminder Added", Toast.LENGTH_SHORT).show(); 
      // clear widgets 
      foodNameTextView.setText(""); 
      Calendar currentDate = Calendar.getInstance(); 
      datePicker.updateDate(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DAY_OF_MONTH)); 
     } 
    } 
} 

El Manifiesto es la siguiente:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="ca.maxiao.Food" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="8" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".FoodReminderList" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:label="@string/app_name" 
     android:name=".EditEntry" > 
    </activity> 
    <activity 
     android:label='@string/app_name' 
     android:name=".FoodReminder"></activity> 

    <receiver android:name="ca.maxiao.Food.FoodReceiver"> 
     <intent-filter> 
      <action android:name="Alarm_Setting" /> 
     </intent-filter> 
    </receiver> 
</application> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.VIBRATE"/> 
</manifest> 
+0

Hay una [publicación] (http://www.mail-archive.com/[email protected]/msg194903.html) sobre el error similar. Entiendo que podría ser un problema de carrera de subprocesos, pero aún no sé cómo revisar mis códigos. – Selkie

+0

¿Puede agregar su archivo de manifiesto aquí? – Yury

+0

seguro. manifiesto agregado. – Selkie

Respuesta

2

hice algunas pruebas más y lockon el problema en la clase interna anónima para el botón Atrás , ya que el error aparecerá cada vez que haga clic en esto antes de reiniciar la aplicación. Si cambio actividades usando el botón "volver atrás" en el teléfono, todo está bien.

que añade una línea en la clase interna

EditEntry.this.finish(); 

Hace resolver el problema. Traté de probarlo de manera más sistemática esta vez. Digamos que el código sin la línea de arriba es A, y el código con esta línea es B. Escenario va como sigue

1.run A continuación, A -> Error

2.run A entonces B - > Error

3.run B, entonces A -> OK

4.run B, entonces B -> OK

Por lo tanto, supongo que es algún tipo de problema sobre la pila de actividad?

+0

Intenté reproducir y pude por un tiempo, pero ya no. Probablemente fue el resultado de que uno de los recursos compilados no se actualizó. Empezó a funcionar todo el tiempo cuando ejecuté una limpieza. Si invierte esa línea de nuevo a solo "startActivity (intención)"; ¿vuelve el error? ¡Estoy realmente interesado en este! – MikeC

+0

Vaya, cometí un error en esta publicación. Probé varios enfoques, y deben mezclarse de alguna manera. Revisé mi respuesta. Por favor revíselo nuevamente. – Selkie

+0

@MikeC Gracias por su interés. Edito mi respuesta. Creo que limpiar el proyecto tiene el mismo efecto que EditEntry.this.finish()? ¿Sabes cuál es la razón exacta detrás de esto? – Selkie

1

En realidad, la verdadera solución a este problema es un problema de permisos de carpeta. Asegúrese de que está operando en una carpeta que puede modificar. Solo solucioné el problema por mi cuenta asegurándome de estar en una carpeta con los permisos adecuados.

+0

que lo resolvió para mí! – oli

3

Tuve exactamente el mismo error, aunque con otro código más simple que el tuyo. Descubrí que el problema solo ocurría si no cerraba la aplicación en el emulador después de volver a ejecutarla desde eclipse. Entonces, si lo cierro antes de ejecutarlo desde eclipse, todo funciona bien. Pero como soy nuevo en Android, no tengo idea de por qué es así. Las aplicaciones de prueba anteriores esto nunca fue un problema.

Cuestiones relacionadas