首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(SurfaceHolder.Callback) surfaceCreated从未调用

(SurfaceHolder.Callback) surfaceCreated从未调用
EN

Stack Overflow用户
提问于 2013-05-21 00:32:34
回答 1查看 3.6K关注 0票数 0

我正在开发一个使用SurfaceView绘制位图的安卓游戏引擎,其框架类似于LunarLander。我的主要游戏引擎活动设置布局,以便显示一个SurfaceView扩展类,如下所示:

代码语言:javascript
复制
super.onCreate(savedInstanceState);

    setContentView(R.layout.ss_layout);

    SSSurfaceView ssSurfaceView = (SSSurfaceView)findViewById(R.id.surface_view);
    SSSurfaceView.SSViewThread renderThread =
        (SSSurfaceView.SSViewThread) ssSurfaceView.getThread();    

findViewById方法成功地返回了我的SurfaceView扩展类的一个实例,并且我能够运行我在类中定义的线程,这个线程是在这个方法中创建的,类构造函数:

代码语言:javascript
复制
public SSSurfaceView(Context context, AttributeSet attributes)
{
    super(context, attributes);

    SurfaceHolder holder = getHolder();
    holder.addCallback(this);

    thread = new SSViewThread(holder, context);
}

构造函数应该获得对关联SurfaceHolder的引用,然后将该引用传递给线程构造函数。我开始在holder.lockCanvas( null )返回null的线程运行方法中出现问题。我在某个地方读到,这可能意味着曲面尚未创建,因此我使用在surfaceCreated回调中设置为true的布尔值添加了一个if语句。

代码语言:javascript
复制
    public void run()
    {
        Canvas canvas = null;
        try
        {
            canvas = holder.lockCanvas(null);
            //I added the condition below
            if(surfaceCreated)
            {
                drawAll(canvas);
            }
        }
        catch(Exception e)
        {
            Log.wtf("SurfaceView", "exception");
        }
        finally
        {
            if(canvas != null)
            {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

以下是回调:

代码语言:javascript
复制
public void surfaceCreated(SurfaceHolder holder)
{
    surfaceCreated = true;
}

事实证明,surfaceCreated从未被调用过。我的应用程序显示一个灰色屏幕,不执行其他操作,因为drawAll方法从未被迭代过。下面是要引导的layout.xml文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.bostonwalker.sseng.SSSurfaceView
        android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

编辑:这不是我的全部代码,我试图将我的示例限制在相关部分。线程是在主循环中调用的,但只要有时间,回调就不会触发。

编辑:下面是在UI线程中迭代的循环:

代码语言:javascript
复制
while(!halt)
    {
        //EDIT: Changed from .run() to .start()
        renderThread.start();
        gameThread.start();
        //Wait for both threads to proceed before continuing
        try
        {
            renderThread.join();
            gameThread.join();
        }
        catch (InterruptedException e)
        {
            //Do nothing
        }

        Thread.currentThread();
        try
        {
            Thread.sleep(2);
        }
        catch (Exception e)
        {
            //Do nothing
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2013-05-21 02:13:36

您的绘图线程不循环-它只运行一次并退出。表面很可能还没有在第一次运行的时候被创造出来。

您需要将当前的代码放在某种循环中,例如(在伪代码中):

代码语言:javascript
复制
while(!done) {
   lockTheCanvas();
   drawAFrame();
   unlockTheCanvas();
   sleep(FRAME_INTERVAL);
}

然后,您需要在适当的时间终止线程,方法是将“完成”设置为true;注意,您需要睡眠(),否则,您的线程将占用cpu,并且永远不会终止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16660336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档