2016-04-16 13 views
7

Quando il mio SplashActivity apre la LoginActivity la mia app si arresta in modo anomalo.

Quello che segue è il mio SplashActivity.java:

package com.example.android.appName; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

import java.util.Timer; 
import java.util.TimerTask; 

public class SplashActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 

     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      public void run() { 
       Intent intent = new Intent(SplashActivity.this, LoginActivity.class); 
       startActivity(intent); 
       finish(); 
      } 
     }, 1500); 
    } 
} 

e la mia LoginActivity.java:

package com.example.android.appName; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

public class LoginActivity extends AppCompatActivity { 
    private EditText usernameField = (EditText)findViewById(R.id.username), 
        passwordField = (EditText)findViewById(R.id.password); 
    private TextView error = (TextView)findViewById(R.id.error); 
    private ProgressBar progress = (ProgressBar)findViewById(R.id.progress); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.login_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (android.os.Build.VERSION.SDK_INT > 5 
       && keyCode == KeyEvent.KEYCODE_BACK 
       && event.getRepeatCount() == 0) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    public void exit(MenuItem item) { 
     finish(); 
    } 

    public void signIn(View view) { 
     Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 
} 

Parte di AndroidManifest.xml:

<activity android:name=".SplashActivity" 
    android:theme="@style/NoActionBar"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
<activity 
    android:name=".LoginActivity" 
    android:label="@string/title_activity_login" /> 

Errore nel logcat:

04-16 23:24:16.124 4015-4015/com.example.android.appName E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.android.appName, PID: 4015 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.android.appName/com.example.android.appName.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2993) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248) 
    at android.app.ActivityThread.access$1000(ActivityThread.java:197) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:145) 
    at android.app.ActivityThread.main(ActivityThread.java:6872) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference 
    at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:68) 
    at android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.java:145) 
    at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:28) 
    at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:42) 
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:186) 
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:168) 
    at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:508) 
    at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:180) 
    at com.example.android.appName.LoginActivity.<init>(LoginActivity.java:20) 
    at java.lang.reflect.Constructor.newInstance(Native Method) 
    at java.lang.Class.newInstance(Class.java:1690) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1080) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2983) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248)  
    at android.app.ActivityThread.access$1000(ActivityThread.java:197)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:145)  
    at android.app.ActivityThread.main(ActivityThread.java:6872)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
+0

Hai dichiarato LoginActivity nel manifest? – NSimon

+0

@NicolasSimon Sì, ho fatto –

+0

'TimerTask.run()' non viene eseguito sul thread dell'interfaccia utente. Se inizi la tua attività dal thread dell'interfaccia utente, allora funziona? –

risposta

34

Un non è completamente inizializzato e pronto per cercare le viste fino a dopo setContentView(...) è chiamato in onCreate().

dichiarare solo i campi come la seguente:

private EditText usernameField, passwordField; 
private TextView error; 
private ProgressBar progress; 

e quindi assegnare i valori in onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    usernameField = (EditText)findViewById(R.id.username); 
    passwordField = (EditText)findViewById(R.id.password); 
    error = (TextView)findViewById(R.id.error); 
    progress = (ProgressBar)findViewById(R.id.progress); 
} 

potrebbero non essere parte del problema, ma come un po 'più di consiglio un Timer esegue lo TimerTask su un thread in background e in questo caso dovrebbe essere evitato. Sostituire Timer con Handler invece di eseguirlo sul thread dell'interfaccia utente.

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Intent intent = new Intent(SplashActivity.this, LoginActivity.class); 
      startActivity(intent); 
      finish(); 
     } 
}, 1500); 
+0

Questo non ha risolto il problema, ma grazie per il' Handler' però :) –

+0

Ok questa dovrebbe essere la risposta corretta questa volta;) –

+0

Di sicuro è! Grazie mille: P In una nota a margine, spero davvero che Android Studio un giorno fornirà messaggi di errore più utili e più chiari di questo ... –