好的,所以我似乎不太能使它正常工作,我试图找到适当的方法来增加可运行的Surfaceview的延迟。我最初只是使用Thread.sleep开头,但是在Google上有这么多条目说使用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吗?还是我在这里如何使用处理程序?我是新手,所以任何帮助将不胜感激=)

最佳答案

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

有关如何在背景Looper上正确创建Looper的信息,请参见Thread,然后可以使用该背景来创建背景Handler

框架中有一个名为HandlerThread的帮助程序类,可以为您做此样板。

09-05 13:43