Java / Android线程暂停错误

时间:2014-12-02 14:37:49

标签: java android multithreading

我有一个用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是主要活动的背景。

2 个答案:

答案 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();
    }
  }
}