2015-07-09 5 views
0

У меня есть такой классПочему этот код заставляет мое приложение останавливаться при onPause и onResume?

class C 
{ 
    MainActivity mainActivity; 
    boolean isPaused; 

    public void A() 
    { 
     B b = new B() 
     { 
      public void run() 
      { 

       isDone = true; 
      } 
     }; 

     mainActivity.runOnUiThread(b); 

     while(!b.isDone && !isPaused) 
     { 
      try { Thread.sleep(1); } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
       break; 
      } 
     } 
    } 
} 


abstract class B implements Runnable 
{ 
    public boolean isDone = false; 
} 

Тогда это называется визуализатора, который реализует GLSurfaceView.Renderer

@Override 
public void onDrawFrame(GL10 gl) 
{ 
    c.A(); 
} 

с является InstanceOf C и mainActivity называют GLSurfaceView.onPause и onResume когда OnPause и onResume из сам называется. Он также устанавливает isPaused c. В режиме onPause и onResume GLSurfaceView просто вызывайте его super onPause и onResume.

Затем, когда onPause и onResume вызываются, мое приложение замерзает. Чтобы найти проблему, я удалил другой код, кроме объяснения, но это все еще происходит. Как я могу это исправить?

ответ

3

Выполняется по резьбе пользовательского интерфейса. Вы блокируете поток бесконечно, потому что у вас никогда не будет !b.isDone && !isPaused, чтобы оценить значение false. Вы никогда не должны звонить Thread.sleep() в основной поток пользовательского интерфейса.

EDIT: Я был на самом деле неправ об этом. Средство визуализации вызывается из отдельного потока, чтобы предотвратить такой блок в потоке пользовательского интерфейса. Однако по-прежнему существует проблема с совместным использованием переменной (isDone) между двумя потоками. Это можно преодолеть, сделав isDone volatile.

+0

Благодарим вас за ответ. Тем не менее, я должен ждать b, так как он должен быть вызван для каждого onDrawFrame. Как я могу это сделать, не блокируя поток пользовательского интерфейса? –

+0

Что вы собираетесь делать? Этот код, похоже, не имеет реальной логики. Если это длительный процесс, это не должно делаться в потоке пользовательского интерфейса. – dharms

+0

в b, я получаю привязку к GoogleMap, вызывая GoogleMap.getProjection(). GetVisibleRegion(). LatLngBounds. –