Android倒数计时器与游戏循环问题
我有一个倒计时计时器试图从一个surfaceview线程(不是主线程)倒计时,它给出了一个异常“无法在未调用Looper.prepare()的线程内创建处理程序”。看看他们说的使用处理程序解决问题的其他答案(我不能真正使用runonUIthread,因为我没有访问任何活动的权限) 我的问题是如何确切地使用处理程序,以允许下面的代码从工作线程按预期运行 (在上下文中,我试图通过在倒计时的每一个滴答声中更改它们的alpha值,从而在工作线程下将一些图形渲染到surfaceview画布上)Android倒数计时器与游戏循环问题,android,multithreading,countdowntimer,Android,Multithreading,Countdowntimer,我有一个倒计时计时器试图从一个surfaceview线程(不是主线程)倒计时,它给出了一个异常“无法在未调用Looper.prepare()的线程内创建处理程序”。看看他们说的使用处理程序解决问题的其他答案(我不能真正使用runonUIthread,因为我没有访问任何活动的权限) 我的问题是如何确切地使用处理程序,以允许下面的代码从工作线程按预期运行 (在上下文中,我试图通过在倒计时的每一个滴答声中更改它们的alpha值,从而在工作线程下将一些图形渲染到surfaceview画布上) 您可以组合
您可以组合处理程序和工作线程。在主线程中创建处理程序,并使用工作线程中的处理程序引用进行UI更新
public final static int MSG_TICK = 0;
public final static int MSG_DONE = 1;
public final static String KEY_MSG = "message";
处理消息和更新用户界面
final Handler handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case MSG_TICK:
Bundle bundle = msg.getData();
if (bundle != null) {
String content = bundle.getString(KEY_MSG);
// TODO: draw content
}
break;
case MSG_DONE:
// TODO: draw content
break;
}
}
};
从工作线程发送消息
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished)
{
Log.e("TEST", ""+millisUntilFinished / 1000);
message = ("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish()
{
message = "finished";
}
}.start();
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
int seconds = 30;
String message = null;
while (seconds != 0) {
message = "seconds remaining: " + seconds;
Message msg = new Message();
// what message
msg.what = MSG_TICK;
// set data
Bundle data = new Bundle();
data.putString(KEY_MSG, message);
msg.setData(data);
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
--seconds;
}
message = "finished";
handler.sendEmptyMessage(MSG_DONE);
}
}).start();