Android:线程似乎运行时间太长,即使它已经停止了

时间:2013-10-09 21:18:22

标签: java android multithreading surfaceview

我在画布上有一个Android绘画线程。这一切都很好,但如果我按下后退按钮,应用程序崩溃,因为线程仍然试图在当时为null的画布上绘制。从代码中我会说线程永远不会再到达那段代码了。

按下后退按钮,我的Surface会被破坏:

public void surfaceDestroyed(SurfaceHolder holder) 
{
    boolean retry = true;
    thread.setRunning(false);
    while (retry) 
    {
        try 
        {
            thread.join();
            retry = false;
        } 
        catch (InterruptedException e) 
        {
        }
    }
}

因此,正如您在上面所看到的,我将thread.setRunning设置为false,我的线程执行此操作

  public void run() 
  {
      while (run) 
      {
          Canvas c = null;
          try 
          {
              c = sh.lockCanvas(null);
              synchronized (sh) 
              {
                  doDraw(c);
              }
          } 
          finally 
          {
              if (c != null) 
              {
                  sh.unlockCanvasAndPost(c);
              }
          }
    }
  }

只要我将此var设置为false,while循环就应该停止,但它仍然会进入doDraw()方法。我不明白为什么doDraw(这里我得到我的空指针expetion)仍然被调用。任何一个想法?

3 个答案:

答案 0 :(得分:0)

我不是Android专家,而是初学者,但是扩展同步块(你必须具有读取值并将值用作一个原子操作),例如

          synchronized (sh) 
          {
               c = sh.lockCanvas(null);                  
               doDraw(c);
          }

此外,或许你可以在onStop中停止/销毁你的附加线程吗?你的活动的onDestroy方法?

我也想知道最后阻止。也许它也应该同步?不确定......

答案 1 :(得分:0)

我不知道它是否适合您,但您可以尝试在 IntentService 中执行相同的任务。

在活动结束时停止IntentService,这可能会解决您的问题。我想你使用处理程序来绘制doDraw方法,我错了吗?请让我知道你的想法和结果

答案 2 :(得分:0)

Thread#join不会杀死线程,只是等待它死掉。您应该通过设置run=false或使用stopinterrupt等方法来破坏线程内的循环。它们已被弃用,基本上不应该被使用。