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 延迟的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章