如何解决停止服务会导致孤立线程
| 我将继续阅读《 Pro Android 2》一书,研究包含两个类的Service示例:BackgroundService.java和MainActivity.java。 MainActivity类如下所示,并具有几个按钮。取消绑定按钮unbindBtn停止服务,但似乎没有其他作用,例如杀死服务启动的线程。 public class MainActivity extends Activity {
private static final String TAG = \"MainActivity\";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG,\"starting service\");
Button bindBtn = (Button)findViewById(R.id.bindBtn);
bindBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent backgroundService = new Intent(MainActivity.this,com.marie.mainactivity.BackgroundService.class);
startService(backgroundService);
}
});
Button unbindBtn = (Button)findViewById(R.id.unbindBtn);
unbindBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
stopService(new Intent(MainActivity.this,BackgroundService.class));
}
});
}
}
该文档说:“如果您的服务要执行任何CPU密集型工作或阻止操作...,则应在服务内创建一个新线程来执行该工作。”这正是BackgroundService类的作用下面。如下所示,我在线程的run()方法中添加了while(true)循环,以查看停止服务时线程发生了什么情况。
public class BackgroundService extends Service {
private NotificationManager notificationMgr;
@Override
public void onCreate() {
super.onCreate();
notificationMgr = NotificationManager)getSystemService(NOTIFICATION_SERVICE);
displayNotificationMessage(\"starting Background Service\");
Thread thr = new Thread(null,new ServiceWorker(),\"BackgroundService\");
thr.start();
}
class ServiceWorker implements Runnable
{
public void run() {
// do background processing here...
long count = 0;
while (true) {
if (count++ > 1000000)
{
count = 0;
Log.d(\"ServiceWorker\",\"count reached\");
}
}
//stop the service when done...
//BackgroundService.this.stopSelf();
}
}
@Override
public void onDestroy()
{
displayNotificationMessage(\"stopping Background Service\");
super.onDestroy();
}
@Override
public void onStart(Intent intent,int startId) {
super.onStart(intent,startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void displayNotificationMessage(String message)
{
Notification notification = new Notification(R.drawable.note,message,System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this,new Intent(this,MainActivity.class),0);
notification.setLatestEventInfo(this,\"Background Service\",contentIntent);
notificationMgr.notify(R.id.app_notification_id,notification);
}
}
当我按下MainActivity类中的unbind按钮unbindBtn时,我相信此示例中的服务将停止。但是从我在logcat中可以看到,由Service启动的线程继续运行。就像线程现在是某种孤儿,没有明显的方法可以停止它。我已经看到其他源代码在线程的run()方法中使用while(true)循环。除非提供一种打破循环的方法,否则这似乎很糟糕。通常是这样吗?还是在启动它的服务停止后杀死线程的其他方法?
解决方法
您应提供一个'running \'
boolean
。
while(running) {
//do your stuff
}
您想要使其可以更新。也许您的Service
\'5'方法应该在Runnable
上调用stopProcessing()
方法,这会将'running \'boolean
设置为false
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。