当前位置: 首页 > 知识库问答 >
问题:

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

施阎宝
2023-03-14

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

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意图,int starId)方法内部,我正在以以下方式运行一个线程...

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

我可能上传了几个Mbs的视频文件。我希望上传是持续的,即使我退出应用程序。我是Android的新手,所以任何帮助都将不胜感激。谢谢。

共有2个答案

夏理
2023-03-14

要杀死on销毁()中的线程,我认为可以这样做:

myService.getThread().interrupt();

注:方法线程。stop()已弃用

编辑:: 试试这个

public void stopThread(){
  if(myService.getThread()!=null){
      myService.getThread().interrupt();
      myService.setThread(null);
  }
}
申屠鹏
2023-03-14

我的建议是黑客攻击,但是...

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

请注意,如果您使用线程。中断(),线程必须反复检查是否被中断。一些java方法抛出InterruptedException(如Thread.sleep()和一些i/o方法),但其他方法不会对中断状态做出反应。线程可能不会中断耗时的操作。中断(),线程将不会中断,直到这些耗时的操作完成。此外,一些真实的代码(可能包括可在项目中重用的代码)是根据Eclipse的建议编写的:有一个InterruptedException,让我们用一个try/catch将异常记录下来,什么也不做。

 类似资料:
  • 我是Android的新手,我对服务和线程的生命周期感到很困惑。 假设我有一个活动,它通过调用startService()在工作线程中启动服务。根据谷歌文档,即使调用组件被破坏,该服务也将无限期运行。 所以我的问题是:如果应用程序进程被完全销毁(退出并从后台堆栈中清理),服务是否仍在运行?UI线程是否仍在运行?如果是,这是否意味着即使其调用进程被破坏,线程也不一定会被终止?

  • 本文向大家介绍关于laravel 子查询 & join的使用,包括了关于laravel 子查询 & join的使用的使用技巧和注意事项,需要的朋友参考一下 本项目中关联了2个数据库 在某个需求中,需要使用子查询获取snapshot快照表库的关联数据,从而实现以下sql逻辑 其中子查询主要用到以下query builder语句 而join语句中可传入匿名函数重新构造,如再其中加多几个连接条件,或者查

  • 问题内容: 我们公司有一个每天运行的批处理应用程序,它主要执行一些与数据库相关的工作,例如,从文件将数据导入数据库表。 该应用程序中定义了20多个任务,每个任务可能取决于其他任务。应用程序一个接一个地执行任务,整个应用程序在单个线程中运行。 完成所有任务需要3到7个小时。我认为它太长了,所以我想也许我可以通过多线程来提高性能。 我认为,由于任务之间存在依赖性,因此使任务并行运行不是很好(或者很不容

  • 查询是根据用户的请求用可读格式显示从数据库中提取的数据。Navicat 提供强大的查询工具:查询编辑器 - 可直接编辑查询文本,查询创建工具、查找创建工具或聚合创建工具 - 视觉化地创建查询。你可以保存查询,用于设置自动运行任务。在主窗口中,点击 “查询”来打开查询的对象列表。你亦可以在主工具栏点击 “新建查询”来创建一个新的查询而不必打开任何连接。 若要使用外部编辑器打开查询,请右击查询并选择“

  • 查询是根据用户的请求用可读格式显示从数据库中提取的数据。Navicat 提供强大的查询工具:查询编辑器 - 可直接编辑查询文本,查询创建工具、查找创建工具或聚合创建工具 - 视觉化地创建查询。你可以保存查询,用于设置自动运行任务。在主窗口中,点击 “查询”来打开查询的对象列表。你亦可以在主工具栏点击 “新建查询”来创建一个新的查询而不必打开任何连接。 若要使用外部编辑器打开查询,请按住 Contr

  • 查询是根据用户的请求用可读格式显示从数据库中提取的数据。Navicat 提供强大的查询工具:查询编辑器 - 可直接编辑查询文本,查询创建工具、查找创建工具或聚合创建工具 - 视觉化地创建查询。你可以保存查询,用于设置自动运行任务。在主窗口中,点击 “查询”来打开查询的对象列表。你亦可以在主工具栏点击 “新建查询”来创建一个新的查询而不必打开任何连接。 【提示】查询(.sql 或 .js)保存于设置