2012-02-22 48 views
0

正試圖暫停一個線程,然後恢復它,但是當我暫停它凍結應用程序。我嘗試了幾件事,但沒有運氣。 我的主要活動是調用線程,並有按鈕,將暫停線程和第二個可運行的類,它開始運行,並繪製我的情節,其中包括和暫停功能。我執行的是代碼遵循在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(); 
      } 
     } 

    } 

我怎麼可以暫停線程,然後再次啓動它。當我暫停它的線程鎖而不是隻有平局陰謀所有的屏幕和按鈕可以進行選擇,而不

編輯

我補充一點,你告訴我,從暫停的主要活動代碼按鈕從我的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

當你暫停主線程(UI線程) – ngesh 2012-02-22 09:29:28

回答

2

您正在調用UI線程上的暫停,這確實會導致應用程序凍結。

,你必須從內部暫停特定線程,像這樣:

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 2012-02-22 10:13:46

+0

對不起,我的回答是完全錯誤的。我現在要更正 – njzk2 2012-02-22 13:38:46

+0

ok.how我是從我的主要活動中的暫停按鈕以及可運行類和所有代碼在第二課中的時間內調用它的嗎?當我按下暫停給第二課的信號時怎麼樣?對不起,它是第一次使用線程進行處理,而且有點混亂。我怎麼可以調用暫停功能,這是同步? – prokopis 2012-02-22 20:25:09