在java android中等待/恢复线程

时间:2012-02-22 09:24:29

标签: java android multithreading plot

我正在尝试暂停一个线程然后恢复它,但是当我暂停时它会冻结应用程序。我尝试了几件事,但没有运气。 在我的主要活动上我正在调用线程,并有一个按钮,它将暂停线程和第二个可运行的类,它开始运行并绘制我的情节,包括和暂停功能。我实现的代码是以下

主要活动

            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 个答案:

答案 0 :(得分: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,除非你在线程中,否则没有办法强制线程暂停。