我有一个倒数计时器试图从一个表面视图线程(不是主线程)倒计时,它给出了一个异常“无法在未调用Looper.prepare()的线程内创建处理程序”。看看其他答案,他们说使用处理程序来解决问题(我不能真正使用runonUIthread,因为我无权访问任何活动)。
我的问题是我如何使用处理程序以允许以下代码按工作线程的预期运行?
(对于上下文我试图通过在倒数计时器的每个刻度处更改它们的alpha来将一些图形渲染到surfaceview画布上,从而将其从工作线程中删除)
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();
答案 0 :(得分:0)
您可以组合处理程序和工作线程。在主线程中创建处理程序,并使用工作线程中的处理程序引用进行UI更新。
public final static int MSG_TICK = 0;
public final static int MSG_DONE = 1;
public final static String KEY_MSG = "message";
处理消息并更新UI
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 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();