2012-02-22 30 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