Java 螺纹不';在MainActivity中调用stopService()时,不能停止
主要活动Java 螺纹不';在MainActivity中调用stopService()时,不能停止,java,android,multithreading,service,Java,Android,Multithreading,Service,主要活动 public class MainActivity extends ActionBarActivity { Context c=this; Intent i; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b=(Button)findVi
public class MainActivity extends ActionBarActivity {
Context c=this;
Intent i;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b=(Button)findViewById(R.id.button1);
Button b1=(Button)findViewById(R.id.button2);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
i=new Intent(c,serv.class);
startService(i);
}
});
b1.setOnClickListener(new OnClickListener()
{
public void onClick(View v) {
stopService(i);
}
});
}
}
服务
当我单击按钮停止服务时,会调用ondestroy()消息,但我的线程会继续运行。
日志如下所示:
03-26 16:48:45.065:D/标签(15674):已创建
03-26 16:48:45.065:D/标签(15674):服务已启动
03-26 16:48:45.065:D/标签(15674):正在运行
03-26 16:48:45.495:D/标签(15674):正在运行
03-26 16:48:46.065:D/标签(15674):正在运行
03-26 16:48:46.495:D/标签(15674):正在运行
03-26 16:48:47.065:D/标签(15674):正在运行
03-26 16:48:47.495:D/标签(15674):正在运行
03-26 16:48:48.065:D/标签(15674):正在运行
03-26 16:48:48.505:D/标签(15674):正在运行
03-26 16:48:48.615:D/标签(15674):已销毁
03-26 16:48:49.065:D/标签(15674):正在运行
03-26 16:48:49.495:D/标签(15674):正在运行
试试这个
class bob implements Runnable{
Thread ac;
boolean isRunning = true;
public void run()
{
while(isRunning)
{
Log.d("tag","RUNNING");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void stopRunning()
{
isRunning = false;
}
并且在您的服务中引用runnable对象并调用stopRunning()方法…代码建议了一些共享变量问题。此代码以不适当的方式使用引用。例如,
ac=new-Thread(new-bob())
使用bob()类的新实例引用,但不在while(true){…}
循环中控制它。此外,使用while(true)
或while(1==1)
是一种不好的做法,因为这会使所有应用程序崩溃。这些都是非常糟糕的代码,可能会产生意想不到的事情
我使用信号量方法重新编写您的示例。在本例中,我定义了一个私有布尔信号量
变量,用于控制对while循环的访问
需要注意的是,访问run()
方法是由isAlive()
方法执行的,它还用于检查销毁操作是否无其他操作
重新编写的代码使用JVM上现有的自然监视器控件。在这种情况下,建议从
Thread.stop()-已弃用。这种方法本质上是不安全的。使用thread.stop停止线程会使其解锁所有已锁定的监视器[…]。stop的许多用法应该被代码所取代,这些代码只是修改一些变量,以指示目标线程应该停止运行。[……]
这种方法可以很容易地适应Android或其他Java环境
看看这个问题,你正在你的服务中创建一个新的线程,你没有停止。。就这样吧running@PreethiRao我正在onDestroy()中停止它,您不应该使用线程。停止()它已被弃用。@PreethiRao那么我应该使用什么?我找到了一个更有效的解决方案,仍然感谢您
class bob implements Runnable{
Thread ac;
boolean isRunning = true;
public void run()
{
while(isRunning)
{
Log.d("tag","RUNNING");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void stopRunning()
{
isRunning = false;
}
class MainActivity{
private Service service;
public MainActivity(){
service = new Service();
}
public void startService(){
service.onCreate();
service.onStartCommand();
}
public void stopService(){
service.onDestroy();
}
}
class Bob implements Runnable{
private Boolean semaphore;
public Bob(){
this.semaphore = Boolean.FALSE;
}
public void active(){
this.semaphore = Boolean.TRUE;
}
public void deactivate(){
this.semaphore = Boolean.FALSE;
}
public Boolean isAlive(){
return this.semaphore;
}
@Override
public void run() {
while( isAlive() ){
System.out.println("RUNNING");
sleep();
}
}
private void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
class Service{
private static final int START_NOT_STICKY = 1;
private Thread sThread;
private Bob rBob;
public Service(){
this.rBob = new Bob();
this.sThread = new Thread( rBob );
}
public void onCreate() {
System.out.println("CREATED");
}
public int onStartCommand() {
System.out.println("SERVICE STARTED");
rBob.active();
sThread.start();
return Service.START_NOT_STICKY;
}
public void onDestroy() {
rBob.deactivate();
if( sThread.isAlive() && !rBob.isAlive() ) {
System.out.println("DESTROYED");
}
}
}
public class SampleThreadTest {
public static void main(String a[]) throws InterruptedException {
MainActivity ma = new MainActivity();
Thread.sleep(1000);
ma.startService();
Thread.sleep(5000);
ma.stopService();
Thread.sleep(5000);
}
}