好的,所以我似乎不太能使它正常工作,我试图找到适当的方法来增加可运行的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
的帮助程序类,可以为您做此样板。