瀏覽代碼

Implement main loop in a dedicated thread under Android

Daniele Bartolini 12 年之前
父節點
當前提交
adff51cdf8
共有 2 個文件被更改,包括 119 次插入29 次删除
  1. 61 29
      src/os/android/CrownSurfaceView.java
  2. 58 0
      src/os/android/MainThread.java

+ 61 - 29
src/os/android/CrownSurfaceView.java

@@ -1,3 +1,29 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
 package crown.android;
 
 import android.content.Context;
@@ -7,38 +33,44 @@ import android.view.SurfaceHolder;
 
 public class CrownSurfaceView extends SurfaceView implements SurfaceHolder.Callback
 {
-//-----------------------------------------------------------------------------
+	private MainThread mMainThread;
+
+	//-----------------------------------------------------------------------------
 	public CrownSurfaceView(Context context)
 	{
 		super(context);
+
 		this.getHolder().addCallback(this);
+
+		mMainThread = new MainThread(getHolder(), this);
+
+		setFocusable(true);
 	}
 
-//-----------------------------------------------------------------------------
-    @Override
-    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
-    {    
-    	if (CrownLib.isRunning())
-    	{
-    		CrownLib.frame();
-    	}
-    }
-
-//-----------------------------------------------------------------------------
-    @Override
-    public void surfaceCreated(SurfaceHolder holder) 
-    {
-        CrownLib.setWindow(holder.getSurface());
-    	CrownLib.init();
-    }
-
-//-----------------------------------------------------------------------------
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) 
-    {  
-    	if (CrownLib.isInit())
-    	{
-    		CrownLib.shutdown();
-    	}
-    }
-}
+	//-----------------------------------------------------------------------------
+	@Override
+	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
+	{
+	}
+
+	//-----------------------------------------------------------------------------
+	@Override
+	public void surfaceCreated(SurfaceHolder holder) 
+	{
+		mMainThread.start();
+	}
+
+	//-----------------------------------------------------------------------------
+	@Override
+	public void surfaceDestroyed(SurfaceHolder holder) 
+	{
+		try
+		{
+			mMainThread.join();
+		}
+		catch (InterruptedException e)
+		{
+			e.printStackTrace();
+		}
+	}
+}

+ 58 - 0
src/os/android/MainThread.java

@@ -0,0 +1,58 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+package crown.android;
+
+import android.view.SurfaceHolder;
+
+public class MainThread extends Thread
+{
+	private SurfaceHolder mHolder;
+	private CrownSurfaceView mView;
+
+	public MainThread(SurfaceHolder holder, CrownSurfaceView view)
+	{
+		super();
+
+		mHolder = holder;
+		mView = view;
+	}
+
+	// This is the classic main() replacement for Android
+	@Override
+	public void run()
+	{
+		CrownLib.setWindow(mHolder.getSurface());
+		CrownLib.init();
+
+		while (CrownLib.isRunning())
+		{
+			CrownLib.frame();
+		}
+
+		CrownLib.shutdown();
+	}
+}