我在我的应用程序中使用相机。所以在onCreate()
我得到了相机实例,在onPause()
中我释放了相机,在onResume()
我得到了相机实例,如果变量是null
。然后我添加到我的应用程序另一个活动。从第二个活动开始,我想关闭所有活动......关闭应用程序。我用这种方法:
Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
和
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
工作得很好。申请已结束。但是当我想再次启动应用程序时,我得到强制关闭消息。我使用了逐步调试,我的代码在maCamera = getCameraInstance();
行上失败了:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
maCamera = getCameraInstance();
...
}
错误日志:
11-05 00:48:02.289: E/AndroidRuntime(8257): FATAL EXCEPTION: main
11-05 00:48:02.289: E/AndroidRuntime(8257): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.blabla/com.blabla.YoMainActivity}: java.lang.NullPointerException
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.os.Handler.dispatchMessage(Handler.java:99)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.os.Looper.loop(Looper.java:130)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.ActivityThread.main(ActivityThread.java:3687)
11-05 00:48:02.289: E/AndroidRuntime(8257): at java.lang.reflect.Method.invokeNative(Native Method)
11-05 00:48:02.289: E/AndroidRuntime(8257): at java.lang.reflect.Method.invoke(Method.java:507)
11-05 00:48:02.289: E/AndroidRuntime(8257): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
11-05 00:48:02.289: E/AndroidRuntime(8257): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-05 00:48:02.289: E/AndroidRuntime(8257): at dalvik.system.NativeStart.main(Native Method)
11-05 00:48:02.289: E/AndroidRuntime(8257): Caused by: java.lang.NullPointerException
11-05 00:48:02.289: E/AndroidRuntime(8257): at com.blabla.YoCameraPreview.<init>(YoCameraPreview.java:26)
11-05 00:48:02.289: E/AndroidRuntime(8257): at com.blabla.YoMainActivity.onCreate(YoMainActivity.java:82)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-05 00:48:02.289: E/AndroidRuntime(8257): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
11-05 00:48:02.289: E/AndroidRuntime(8257): ... 11 more
我认为这与释放相机有关。所以我试着在camera.release()
中致电onDestroy()
并且它有效。没有更多的力量关闭消息。
所以我的问题是:这是正常行为吗?为什么不在onPause()中调用release足够?
P.S。如果它不是通常的行为,我可以发布更多的代码,问题可能在我的代码中。
更新
我的代码中的方法:
@Override
protected void onDestroy(){
super.onDestroy();
maPreview = null;
releaseCamera();
}
@Override
protected void onResume(){
super.onResume();
if (maCamera == null) {
maCamera = getCameraInstance();
}
if (maPreview == null) {
maPreview = new YoCameraPreview(this, maCamera);
maLayoutPreview.removeAllViews();
maLayoutPreview.addView(maPreview);
}
}
@Override
protected void onPause() {
super.onPause();
maPreview = null;
releaseCamera();
}
private void releaseCamera(){
if (maCamera != null){
maCamera.release();
maCamera = null;
}
}
我不用这个应用程序拍照。我只使用相机预览,因此我没有设置previewCallback。
答案 0 :(得分:0)
首先,您必须了解android活动生命周期(http://developer.android.com/reference/android/app/Activity.html)。它转到onPauses(),并释放相机。之后,如果再次输入活动,它将进入onResum()而不是oncreate()并导致NPE,因为相机已被释放。
除非您的活动已销毁,否则您的活动将再次转到onCreate()。因此,要解决您的问题,您可以在 onResume()中检查并获取相机实例,然后在 onPause()中发布,或者创建相机 onCreate()并发布 onDestroy()(与您的发现一样)。这意味着你不需要在onPause()和onDestroy()上发布,但是,建议采用第一种方法。
答案 1 :(得分:0)
所以 this 帖子解释了我的问题。
因为,我在onCreate()
方法中捕获了意图附加内容,我也在这里获取了相机实例:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
...
maCamera = getCameraInstance();
...
}
来自Android文档:
You can call finish() from within this function, in which case onDestroy() will be immediately called without any of the rest of the activity lifecycle (onStart(), onResume(), onPause(), etc) executing.
所以onCreate()
方法会运行,它会在onCreate()
完成后立即获取相机实例,活动会直接跳转到onDestroy()
。因为我只在onPause()
发布了相机实例,所以相机从未发布过。通过在return
之后添加finish()
来修复,因此它会跳过获取相机实例。
finish();
return;