关闭并重新打开应用程序时Android崩溃

编程入门 行业动态 更新时间:2024-10-26 04:32:54
本文介绍了关闭并重新打开应用程序时Android崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个非常简单的 android 应用程序,它只显示一个空白屏幕.当我通过按 HOME 按钮关闭应用程序,然后尝试再次打开应用程序时,它崩溃并且我得到强制关闭"按钮.在 Eclipse 中,我收到此错误,ActivityManager:警告:活动未启动,因为当前活动正在为用户保留.".如何修复此崩溃?

I have a really simple android app that just displays a blank white screen. When I close the app by pressing the HOME button, then try to open the app again, it crashes and I get the "Force Close" button. In Eclipse I'm getting this error, "ActivityManager: Warning: Activity not started because the current activity is being kept for the user.". How do I fix this crash?

public class HelloAndroid extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(new Panel(this)); } class Panel extends SurfaceView implements SurfaceHolder.Callback { private TutorialThread _thread; public Panel(Context context) { super(context); // register our interest in hearing about changes to our surface SurfaceHolder holder = getHolder(); holder.addCallback(this); _thread = new TutorialThread(holder, this); setFocusable(true); } @Override public void onDraw(Canvas canvas) { // Clear the background canvas.drawColor(Color.WHITE); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // resize canvas here } @Override public void surfaceCreated(SurfaceHolder holder) { _thread.setRunning(true); _thread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // simply copied from sample application LunarLander: // we have to tell thread to shut down & wait for it to finish, or else // it might touch the Surface after we return and explode boolean retry = true; _thread.setRunning(false); while (retry) { try { _thread.join(); retry = false; } catch (InterruptedException e) { // we will try it again and again... } } } } class TutorialThread extends Thread { private SurfaceHolder _surfaceHolder; private Panel _panel; private boolean _run = false; public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) { _surfaceHolder = surfaceHolder; _panel = panel; } public void setRunning(boolean run) { _run = run; } @Override public void run() { Canvas c; while (_run) { c = null; try { c = _surfaceHolder.lockCanvas(null); synchronized (_surfaceHolder) { _panel.onDraw(c); } } finally { // do this in a finally so that if an exception is thrown // during the above, we don't leave the Surface in an // inconsistent state if (c != null) { _surfaceHolder.unlockCanvasAndPost(c); } } } } }

}

添加 LogCat

03-15 15:36:05.579: INFO/AndroidRuntime(4441): NOTE: attach of thread 'Binder Thread #2' failed 03-15 15:36:05.719: DEBUG/AndroidRuntime(4449): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 03-15 15:36:05.719: DEBUG/AndroidRuntime(4449): CheckJNI is OFF 03-15 15:36:05.719: DEBUG/dalvikvm(4449): creating instr width table 03-15 15:36:05.759: DEBUG/AndroidRuntime(4449): --- registering native functions --- 03-15 15:36:05.969: INFO/ActivityManager(1294): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.helloandroid/.HelloAndroid } 03-15 15:36:05.979: DEBUG/Launcher(1371): onPause+ 03-15 15:36:05.979: DEBUG/Launcher.DragController(1371): +endDrag: false 03-15 15:36:05.979: DEBUG/Launcher.DragController(1371): mDragging == false 03-15 15:36:05.979: DEBUG/Launcher.DragController(1371): -endDrag: false 03-15 15:36:05.979: DEBUG/Launcher(1371): onPause- 03-15 15:36:05.999: DEBUG/AndroidRuntime(4428): Shutting down VM 03-15 15:36:05.999: DEBUG/AndroidRuntime(4449): Shutting down VM 03-15 15:36:05.999: WARN/dalvikvm(4428): threadid=1: thread exiting with uncaught exception (group=0x4001d7e0) 03-15 15:36:06.009: DEBUG/dalvikvm(4449): Debugger has detached; object registry had 1 entries 03-15 15:36:06.009: INFO/AndroidRuntime(4449): NOTE: attach of thread 'Binder Thread #3' failed 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): FATAL EXCEPTION: main 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): java.lang.IllegalThreadStateException: Thread already started. 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at java.lang.Thread.start(Thread.java:1322) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at com.example.helloandroid.HelloAndroid$Panel.surfaceCreated(HelloAndroid.java:55) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.SurfaceView.updateWindow(SurfaceView.java:538) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.View.dispatchWindowVisibilityChanged(View.java:3888) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:725) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:725) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.ViewRoot.performTraversals(ViewRoot.java:748) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.view.ViewRoot.handleMessage(ViewRoot.java:1737) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.os.Handler.dispatchMessage(Handler.java:99) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.os.Looper.loop(Looper.java:123) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at android.app.ActivityThread.main(ActivityThread.java:4627) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at java.lang.reflect.Method.invokeNative(Native Method) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at java.lang.reflect.Method.invoke(Method.java:521) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 03-15 15:36:06.029: ERROR/AndroidRuntime(4428): at dalvik.system.NativeStart.main(Native Method) 03-15 15:36:06.039: WARN/ActivityManager(1294): Force finishing activity com.example.helloandroid/.HelloAndroid 03-15 15:36:06.541: WARN/ActivityManager(1294): Activity pause timeout for HistoryRecord{450300c0 com.example.helloandroid/.HelloAndroid} 03-15 15:36:06.549: DEBUG/Launcher(1371): onResume+ 03-15 15:36:06.549: DEBUG/Launcher.DragController(1371): +endDrag: false 03-15 15:36:06.549: DEBUG/Launcher.DragController(1371): mDragging == false 03-15 15:36:06.549: DEBUG/Launcher.DragController(1371): -endDrag: false 03-15 15:36:06.549: DEBUG/Launcher(1371): onResume- 03-15 15:36:08.645: ERROR/KINETO(1370): KLOG0C3- xmk_QueryOSQueue SDL Queue empty : WAIT_FOREVER

推荐答案

我已经回答了这样一个问题 这里.

I've answered a question like this here.

您遇到的错误可能是由您的 Thread 引起的(虽然没有看到完整的 Logcat,但很难判断).您每次创建表面时都会启动它,这将使您的应用程序崩溃,因为您不能调用 Thread.start() 两次.请查看我上面的链接,以更深入地描述该问题以及您应该如何解决它.

The error you're getting is probably caused by your Thread (without seeing the full Logcat it's hard to tell though). You're starting it every time the surface is created, which will make your application crash because you can't call Thread.start() twice. Look at my link above for a more in-depth description of the problem and how you should solve it.

由于我的解释不够,我将发布整个解决方案:

Since my explanation wasn't enough I will post the whole solution:

在你的 Runnable/Thread 中:

private Object mPauseLock = new Object(); private boolean mPaused; // Constructor stuff. // This should be after your drawing/update code inside your thread's run() code. synchronized (mPauseLock) { while (mPaused) { try { mPauseLock.wait(); } catch (InterruptedException e) { } } } // Two methods for your Runnable/Thread class to manage the thread properly. public void onPause() { synchronized (mPauseLock) { mPaused = true; } } public void onResume() { synchronized (mPauseLock) { mPaused = false; mPauseLock.notifyAll(); } }

在您的 SurfaceView 类中:

private boolean mGameIsRunning; @Override public void surfaceCreated(SurfaceHolder holder) { // Your own start method. start(); } public void start() { if (!mGameIsRunning) { thread.start(); mGameIsRunning = true; } else { thread.onResume(); } }

更多推荐

关闭并重新打开应用程序时Android崩溃

本文发布于:2023-11-27 03:26:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1636375.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:应用程序   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!