android surfaceview runnable 延迟的正确方法?

Posted

技术标签:

【中文标题】android surfaceview runnable 延迟的正确方法?【英文标题】:android surfaceview runnable proper way to delay? 【发布时间】:2013-12-05 08:13:52 【问题描述】:

好的,所以我似乎无法让它工作,我正在尝试找到正确的方法来为可运行的表面视图添加延迟。我最初只使用 Thread.sleep,但由于谷歌上有很多条目说使用 Thread.sleep 作为可运行对象是不好的,我一直在尝试“正确”使用处理程序来实现基本相同的目标。这是我到目前为止测试过的代码,请注意处理程序延迟的注释和位置

public class demosf extends Activity 

    OurView v;
    int Measuredwidth;
    int Measuredheight;
    WindowManager w;
    Bitmap whatever;
    LinearLayout llMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Measuredwidth = 0;
        Measuredheight = 0;
        whatever = BitmapFactory
                .decodeResource(getResources(), R.raw.dragarrow);

        llMain = new LinearLayout(this);

        setContentView(llMain);
        v = new OurView(demosf.this);

        llMain.post(new Runnable() 

            @Override
            public void run() 

                Measuredwidth = llMain.getWidth();
                Measuredheight = llMain.getHeight();

                llMain.addView(v);
            
        );
    
//the Runnable:
    public class OurView extends SurfaceView implements Runnable 

        Thread t = null;
        SurfaceHolder holder;
        boolean isItOK;
        Handler handler = new Handler();

        public OurView(Context context) 
            super(context);
            holder = getHolder();
        

        @Override
        public void run() 
            //handler.postDelayed placed here freezes app
            while (isItOK) 
                if (!holder.getSurface().isValid()) 
                    continue;
                
                Canvas c = holder.lockCanvas();
                c.drawARGB(255, 0, 0, 0);
                c.drawBitmap(
                        whatever,
                        ((float) this.getWidth() - (float) whatever.getWidth()),
                        ((float) this.getHeight() - (float) whatever
                                .getHeight()), null);
                holder.unlockCanvasAndPost(c);

                //handler.postDelayed placed here also freezes app
            
            //this one isn't reached
            handler.postDelayed(this, 100);
        

        public void pause() 
            isItOK = false;
            while (true) 
                try 
                    t.join();
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
                break;
            
            t = null;
        

        public void resume() 
            isItOK = true;
            t = new Thread(this);
            t.start();
        
    

    @Override
    protected void onPause() 
        super.onPause();
        v.pause();
    

    @Override
    protected void onResume() 
        super.onResume();
        v.resume();
    


所以我还是坚持使用 Thread.sleep 吗?或者我将如何在这里使用处理程序?我是新手,所以非常感谢您的帮助 =)

【问题讨论】:

【参考方案1】:

在实例化OurView 时,您正在创建Handler,这意味着处理程序将使用当前线程,在本例中为 UI 线程 - 这不是您想要的。

请参阅Looper,了解如何在背景Thread 上正确创建Looper,然后可以使用它来创建背景Handler

框架中有一个名为 HandlerThread 的帮助器类可以为您执行此样板文件。

【讨论】:

所以如果我想添加延迟,我应该在哪里创建 HandlerThread?看起来我和以前有同样的问题,不知道在哪里创建 HandlerThread/Handler。 Google 结果显示的示例类似于我在 Handler 中看到的示例,但仍然没有给我指明方向。如果可能的话,我真的可以举个例子。

以上是关于android surfaceview runnable 延迟的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

android videoview和surfaceview的区别

Android--SurfaceView使用详解

android-tip-关于SurfaceView的使用

Android SurfaceView内容居中显示

android获取surfaceview里面的每一帧

[android] surfaceview的生命周期