android-如何停止服务中的线程?
我的主要活动中有一个选中按钮。如果选中该按钮,则应启动服务,但如果用户未选中该按钮,则我希望停止服务 因此,在取消选中的条件下,我编写了这个android-如何停止服务中的线程?,android,android-service,Android,Android Service,我的主要活动中有一个选中按钮。如果选中该按钮,则应启动服务,但如果用户未选中该按钮,则我希望停止服务 因此,在取消选中的条件下,我编写了这个stopService(intentname)但问题是服务没有停止。以下是我的代码片段: 服务等级 public class SimpleService extends Service { String selectedAudioPath = ""; private MyThread myythread; public Intent
stopService(intentname)代码>但问题是服务没有停止。以下是我的代码片段:
服务等级
public class SimpleService extends Service
{
String selectedAudioPath = "";
private MyThread myythread;
public Intent intent;
public boolean isRunning = false;
long interval=30000;
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
@Override
public void onCreate()
{
super.onCreate();
myythread = new MyThread(interval);
}
@Override
public synchronized void onDestroy()
{
super.onDestroy();
if(!isRunning)
{
myythread.interrupt();
myythread.stop();
isRunning = false;
}
}
@Override
public synchronized void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
if(!isRunning)
{
//this.intent = intent;
//System.out.println("the intent is" + intent);
myythread.start();
isRunning = true;
}
}
class MyThread extends Thread
{
long interval;
public MyThread(long interval)
{
this.interval=interval;
}
@Override
public void run()
{
while(isRunning)
{
System.out.println("Service running");
try
{
String myString = intent.getStringExtra("name");
if(myString == null)
Log.d("Service","null");
else
{
Log.d("Service","not null");
if(myString.equalsIgnoreCase("image"))
{
uploadImages();
Thread.sleep(interval);
}
else if(myString.equalsIgnoreCase("audio"))
{
uploadAudio();
Thread.sleep(interval);
}
}
}
catch (InterruptedException e)
{
isRunning = false;
e.printStackTrace();
}
}
}
你不能停止一个有这样一个不可阻挡的循环的线程
while(true)
{
}
若要停止该线程,请声明一个布尔变量并在while循环条件中使用它
public class MyService extends Service {
...
private Thread mythread;
private boolean running;
@Override
public void onDestroy()
{
running = false;
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startid) {
running = true;
mythread = new Thread() {
@Override
public void run() {
while(running) {
MY CODE TO RUN;
}
}
};
};
mythread.start();
}
来源:不要使用线程。改为使用AsyncTask
public class MyService extends Service {
private AsyncTask<Void,Void,Void> myTask;
@Override
public void onDestroy(){
super.onDestroy();
myTask.cancel(true);
}
@Override
public void onStart(Intent intent, int startid) {
myTask = new AsyncTask<Void,Void,Void>(){
@Override
public void doInBackground(Void aVoid[]){
doYourWorkHere();
}
}
myTask.execute();
}
}
公共类MyService扩展服务{
私有异步任务myTask;
@凌驾
公共空间{
super.ondestory();
myTask.cancel(true);
}
@凌驾
公共无效启动(Intent Intent,int startid){
myTask=新的AsyncTask(){
@凌驾
公共作废doInBackground(作废避免[]){
你在这里工作吗;
}
}
myTask.execute();
}
}
可能的重复和可能的重复可能是因为您只复制粘贴的部分代码,但我不知道您为什么需要在示例中使用线程:服务本身已经在后台线程中运行,您可以直接使用它上载文件(从您的代码看,您似乎只有一个线程要上载)你不需要再开始另一个线程。此外,线程中的while循环将一次又一次地无限期地上传同一个文件如果(!isRunning)
真的是故意的吗?@laalto这是我第一次使用..我只是按照教程做的。请添加不应该使用线程而应该使用异步任务的原因。