Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 关于在服务内使用线程的查询。安卓_Android_User Interface_Service - Fatal编程技术网

Android 关于在服务内使用线程的查询。安卓

Android 关于在服务内使用线程的查询。安卓,android,user-interface,service,Android,User Interface,Service,所以我尝试从另一个类开始一个服务类。这是代码 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类(这是完全正

所以我尝试从另一个类开始一个服务类。这是代码

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(); 
}
现在在日志中我得到以下输出

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()方法中使用线程readthread来完成,这是个好主意吗?我可以这样做吗?还是有其他更简单更好的解决方法来实现这一点?或者我不应该在服务类和其他地方的onStart()方法中这样做


我可能正在上传几兆的视频文件。我希望即使退出应用程序,上传也能继续进行。我是安卓的新手,所以任何帮助都将不胜感激。谢谢。

要终止ondestroy()中的线程,我想您可以这样做:

myService.getThread().interrupt();
注意:不推荐使用方法
Thread.stop()

编辑::试试这个

public void stopThread(){
  if(myService.getThread()!=null){
      myService.getThread().interrupt();
      myService.setThread(null);
  }
}

我在这里建议的是一个黑客,但是

您可以声明您的服务在单独的进程中运行(请参阅XML中服务的process属性)。您可以终止该进程(请参见android.os.process.killProcess()和android.os.process.myPid())。这将杀死所有线程,清除所有垃圾和所有内存泄漏


请注意,如果使用Thread.interrupt(),线程必须反复检查是否被中断。一些java方法抛出
InterruptedException
(如Thread.sleep()和一些i/o方法),但其他方法不会对中断状态做出反应。Thread.interrupt()可能不会中断耗时的操作,并且在这些耗时的操作完成之前,线程不会被中断。此外,一些现实生活中的代码(可能包括可在项目中重用的代码)是根据Eclipse的建议编写的:有一个
InterruptedException
,让我们用一个try/catch来围绕它,它记录异常而不做任何事情。

线程内的循环是否会完全运行(即100次)?或者,它会在服务被销毁后立即被销毁吗?实际上,它的用户线程和它将等待其子进程的属性,所以只要在您的工作完成后,在ondestroy()方法中杀死该线程就可以了
public void stopThread(){
  if(myService.getThread()!=null){
      myService.getThread().interrupt();
      myService.setThread(null);
  }
}