Merge "LunarLander: Fix race condition causing crash on exit"

This commit is contained in:
Trevor Johns
2012-11-02 12:59:49 -07:00
committed by Gerrit Code Review
3 changed files with 23 additions and 11 deletions

View File

@@ -15,17 +15,17 @@
--> -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="fill_parent"
android:layout_height="match_parent"> android:layout_height="fill_parent">
<com.example.android.lunarlander.LunarView <com.example.android.lunarlander.LunarView
android:id="@+id/lunar" android:id="@+id/lunar"
android:layout_width="match_parent" android:layout_width="fill_parent"
android:layout_height="match_parent"/> android:layout_height="fill_parent"/>
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="fill_parent"
android:layout_height="match_parent" > android:layout_height="fill_parent" >
<TextView <TextView
android:id="@+id/text" android:id="@+id/text"
android:text="@string/lunar_layout_text_text" android:text="@string/lunar_layout_text_text"

View File

@@ -149,8 +149,8 @@ public class LunarLander extends Activity {
*/ */
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause();
mLunarView.getThread().pause(); // pause game when Activity pauses mLunarView.getThread().pause(); // pause game when Activity pauses
super.onPause();
} }
/** /**

View File

@@ -196,6 +196,8 @@ class LunarView extends SurfaceView implements SurfaceHolder.Callback {
/** Indicate whether the surface has been created & is ready to draw */ /** Indicate whether the surface has been created & is ready to draw */
private boolean mRun = false; private boolean mRun = false;
private final Object mRunLock = new Object();
/** Scratch rect object. */ /** Scratch rect object. */
private RectF mScratchRect; private RectF mScratchRect;
@@ -356,7 +358,13 @@ class LunarView extends SurfaceView implements SurfaceHolder.Callback {
c = mSurfaceHolder.lockCanvas(null); c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) { synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) updatePhysics(); if (mMode == STATE_RUNNING) updatePhysics();
doDraw(c); // Critical section. Do not allow mRun to be set false until
// we are sure all canvas draw operations are complete.
//
// If mRun has been toggled false, inhibit canvas operations.
synchronized (mRunLock) {
if (mRun) doDraw(c);
}
} }
} finally { } finally {
// do this in a finally so that if an exception is thrown // do this in a finally so that if an exception is thrown
@@ -427,8 +435,12 @@ class LunarView extends SurfaceView implements SurfaceHolder.Callback {
* @param b true to run, false to shut down * @param b true to run, false to shut down
*/ */
public void setRunning(boolean b) { public void setRunning(boolean b) {
// Do not allow mRun to be modified while any canvas operations
// are potentially in-flight. See doDraw().
synchronized (mRunLock) {
mRun = b; mRun = b;
} }
}
/** /**
* Sets the game mode. That is, whether we are running, paused, in the * Sets the game mode. That is, whether we are running, paused, in the