2012-02-22 3 views
0

пытаюсь приостановить поток, а затем возобновить его, но когда я сделаю паузу, он заморозит приложение. Я пробую несколько вещей, но не повезло. в моей основной деятельности, вызывающей поток, и кнопку, которая будет приостанавливать поток и второй класс запуска, который он запускает, и рисовать на моем сюжете, который включает в себя и функцию паузы. код, который я осуществить это следоватьwait/resume thread in java android

Основная деятельность

  public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

     mDoctorDynamicXYDatasource= new DoctorDynamicXYDatasource(this, mHandler); 
     findViewById(R.id.Pause).setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
       synchronized(pp){ 
        mDoctorDynamicXYDatasource.Pause(); 
       Log.i("File", "Pause button "); 
        } 
       } 
    }); 
    findViewById(R.id.Start).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      draw(); 
     } 
    }); 


    public void draw(){ 

     ///some code 
     pp= new Thread(data); 
     pp.start(); 
    } 

and on the **DoctorDynamicXYDatasource class** am doing the follow 

    public class DoctorDynamicXYDatasource extends Activity implements Runnable { 

    public void run() { 
     //loading and draw on the plot 
      } 

    public void Pause() { 
     synchronized (Thread.currentThread()) { 
     Log.i("File","pause"); 
       try { 
       Thread.currentThread().wait(); 
      } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
     } 

    } 

как я могу приостановить поток и затем запустить его снова. когда я приостановить нить его заблокировать, а не только Жеребьевка сюжет весь экран и кнопки, не в состоянии сделать выбор

EDIT

я добавить код, который вы мне сказать, и от основной деятельности с паузой кнопка am вызывает фрейм паузы из моего класса DoctorDynamicXYDatasource, но она не синхронизирована, чтобы ждать поток. Я также не позволю вызывать функцию паузы из другого класса?

mDoctorDynamicXYDatasource= new DoctorDynamicXYDatasource(this, mHandler); 
     findViewById(R.id.Pause).setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        Log.i("File", "Pause button pressed"); 
    mDoctorDynamicXYDatasource.pause(); 

       } 
      }); 
+1

Его очевидность для приложения замораживания при приостановке основной нити (поток пользовательского интерфейса) – ngesh

ответ

2

Вы вызываете паузу в потоке пользовательского интерфейса, что действительно приводит к замораживанию приложения.

вы должны приостановить свою специфическую нить от внутренней, как это:

public void run() { 
    // Your code here, there is probably a loop 
    while (someCondition) { 
     // Loop work 
     synchronized(this) { 
      if (pause) { 
       pause = false; 
       wait(); 
      } 
     } 
    } 
} 

public synchronized void pause() { 
    pause = true; 
} 

public synchronized void go() { 
    notify(); 
} 

Вызов паузы позволит поток ждать на следующей итерации. Вызов go позволит потоку немедленно выйти из состояния ожидания.

Afaik, нет способа заставить нить приостановить, если вы не находитесь в нитке.

+1

Я стараюсь и не работаю. это заморозит меня экран и через несколько секунд крах приложения. я стараюсь, и при основном действии на кнопке у меня все еще есть \t \t mDoctorDynamicXYDatasource.Pause(); Почему использование currentthread не так? – prokopis

+0

Извините, мой ответ совершенно неправ. Я исправлю это сейчас – njzk2

+0

ok.how am i goinf, чтобы вызвать его изнутри того времени, когда кнопка паузы находится в моем основном действии, и класс runnable, и весь ваш код в моем втором классе? как, когда я нажал паузу, чтобы дать сигнал второму классу? Мне жаль, что это первый раз, когда я занимаюсь потоками и немного запутался. как я могу вызвать функцию паузы, и это будет синхронизировано? – prokopis