我有一个用run函数实现runnable的类。
@Override
public void run()
{
while(running)
{
// thread code goes here::
threadCode();////
// thread code ends here
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
现在我想尝试暂停线程,如果发生了什么事。 我尝试使用wait()和notify(),但是它崩溃了应用程序,之后我想出了使用“running”布尔值并将其设置为false作为暂停,然后返回true以恢复。 不幸的是,它仍然会崩溃应用程序。
它给我带来了logcat上的致命错误。
“无法在未调用Looper.prepare()的线程内创建处理程序”
是否有任何工作简单的方法来暂停线程? ; / THX
修改 它根本不是关于线程的。 我发现它崩溃的地方。 它在警报对话框中崩溃 这是它的代码:
AlertDialog.Builder builder1 = new AlertDialog.Builder(c);
builder1.setTitle("Game over!");
builder1.setMessage("You survived "+secs+"."+msecs+ " seconds.");
builder1.setCancelable(false);
builder1.setPositiveButton("Replay",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
// intialStuff();
dialog.cancel();
}
});
builder1.setNegativeButton("Rage quit",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert11 = builder1.create();
alert11.show();
我尝试在canvas类上运行它 也许它不能在画布课上工作? C是主要活动的背景。
答案 0 :(得分:0)
在Android线程上的工作方式不同于常规的基于java'main'的程序。从UI线程跨越的线程应该使用Looper供自己使用,否则它们将回退到主UI线程的Looper。对于从run方法内部调用Looper.prepare()的查询,可能是它内部的第一行。但是,从长期可扩展性和正确的方法角度考虑使用Loader或AsynchTask。
答案 1 :(得分:0)
有两个问题,首先是我在AlertDialog的消息上设置了int值,导致崩溃。 修复是:
setMessage("You survived "+Integer.toString(secs)+"."+Integer.toString(msecs)+" seconds.")
第二个问题和主要问题,我不得不在线程上使用hander,以便AlertDialog不会崩溃。
第二个修复: 创建处理程序。
private Handler threadHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
//Go to thread function
threadCode();
}
};
从run函数调用它:
@Override
public void run()
{
while(true)
{
try
{
Thread.sleep(10);
//handler
if(running)
threadHandler.sendEmptyMessage(0);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}