当我SplashActivity打开LoginActivity我的应用程序时崩溃。
SplashActivity
LoginActivity
以下是我的SplashActivity.java:
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); } }
和我的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(); } }
一部分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" />
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)
一个Activity没有完全初始化并准备查找的意见后才setContentView(...)被调用onCreate()。
Activity
setContentView(...)
onCreate()
仅声明如下字段:
private EditText usernameField, passwordField; private TextView error; private ProgressBar progress;
然后在中分配值onCreate:
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); }
可能不是问题的一部分,而是作为额外的建议在后台线程上Timer运行,TimerTask在这种情况下应避免使用。将其替换为Timer,以Handler在UI线程上运行它。
Timer
TimerTask
Handler
new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this, LoginActivity.class); startActivity(intent); finish(); } }, 1500);