我正在尝试暂停一个线程然后恢复它,但是当我暂停时它会冻结应用程序。我尝试了几件事,但没有运气。 在我的主要活动上我正在调用线程,并有一个按钮,它将暂停线程和第二个可运行的类,它开始运行并绘制我的情节,包括和暂停功能。我实现的代码是以下
主要活动
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();
}
});
答案 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,除非你在线程中,否则没有办法强制线程暂停。