所以我试图从另一个类开始一个服务类。这是代码......
Intent intent = new Intent(this, abcservice.class);
startService(intent);
stopService(new Intent(xyz.this, abcservice.class));
Intent i= new Intent(xyz.this, ijk.class);
startActivity(i);
当上面的代码运行时,我的服务类在后台运行,而我被带回到ujk类(这完全没问题)。在abcservice类中的onStart(Intent intent,int startId)方法中,我以下列方式运行一个线程......
@Override
public void onStart(Intent intent, int startId) {
Log.d("S started", "Service is started1");
Log.d("S started", "Service is started2");
Log.d("S started", "Service is started3");
readthread = new Thread(new Runnable() {
public void run() {
try {
for(int i=0; i<100; i++) {
Log.d("S started", "The thread is running ");
}
} catch (Exception e) {
e.printStackTrace();
} } });
readthread.start();
}
这是onDestroy()方法..
@Override
public void onDestroy() {
super.onDestroy();
Log.d("S dest", "Service is destroyed");
}
现在在日志中我得到以下输出......
Service is started1
Service is started2
Service is started3
Service is destroyed
The thread is running
The thread is running
.....98 more times (Thread is running) ....
我的疑问是......
1。这是正确的输出吗?我的意思是如果服务在线程开始运行之前被销毁,线程如何仍在运行并在其中完成循环?
2. 基本上我想将一些文件上传到服务器,我想在服务类的onStart()方法中使用Thread readthread,这是一个好主意?我能这样做吗?或者是否有另一种更简单,更好的解决方法来实现这一目标?或者我不应该在服务类和其他地方的onStart()方法中这样做?
我可能会上传几个Mbs的视频文件。我希望即使退出应用程序也能继续上传。我是Android的新手,所以任何帮助都会受到赞赏。感谢。
答案 0 :(得分:0)
杀死ondestroy()中的线程,我想你可以这样做:
myService.getThread().interrupt();
注意:不推荐使用方法Thread.stop()
编辑::尝试这个
public void stopThread(){
if(myService.getThread()!=null){
myService.getThread().interrupt();
myService.setThread(null);
}
}
答案 1 :(得分:0)
我在这里建议的是黑客攻击,但是......
您可以声明您的服务在单独的进程中运行(请参阅XML中服务的进程属性)。你可以杀死那个进程(参见 android.os.Process.killProcess()和 android.os.Process.myPid())。这会杀死所有线程并消除所有垃圾和所有内存泄漏。
请注意,如果您使用 Thread.interrupt(),您的线程必须反复检查它是否被中断。一些java方法抛出InterruptedException
(如 Thread.sleep()和一些i / o方法),但其他方法不会对中断状态做出反应。 Thread.interrupt()可能不会中断耗时的操作,并且在完成这些耗时的操作之前,线程不会被中断。此外,一些现实代码(可能包括可在项目中重用的代码)是根据Eclipse的建议编写的:有一个InterruptedException
,让我们用try / catch包围它来记录异常并且什么都没有。