-1

我在画布上的 Android 绘画中有一个线程。一切正常,但是如果我按下后退按钮,应用程序会崩溃,因为线程仍试图在当时已经为空的画布上绘制。从代码中我会说线程不应该再到达那段代码。

按下后退按钮时,我的 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(在这里我得到了我的空指针异常)。任何人的想法?

4

3 回答 3

0

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

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

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

我也想知道 finally 块。也许它也应该同步?没有把握...

于 2013-10-09T22:06:59.183 回答
0

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

IntentService 在活动完成时停止,也许它会解决您的问题。我想您正在使用处理程序在 doDraw 方法中进行绘图,我错了吗?请告诉我你的想法和结果

于 2013-10-09T22:09:57.130 回答
0

Thread#join不会杀死线程,它只是等待它死亡。您应该通过设置run=false或使用诸如stopor之类的方法来中断线程内的循环interrupt。它们已被弃用,基本上不应该使用。

于 2013-10-09T22:10:57.067 回答