【问题标题】:Help me learn how to use Services and Threads correctly帮助我学习如何正确使用服务和线程
【发布时间】:2011-05-24 02:03:30
【问题描述】:

我正在寻求帮助,所以我的生活,更重要的是我的用户的生活不会因为我不知道如何正确使用服务和线程而毁掉。

我不是要求冗长的解释,而是更多的确认。如果我错了也没关系。我是来学习的。

如果我理解正确: 1. 服务在后台运行(无 UI)。 2. 一个服务理论上会一直运行直到它自己死掉(我在这里猜测一下) 3.即使主Activity不可见,服务也会继续运行(甚至销毁呢?)

这是我的编码问题。

我已经完成了服务设置和线程。一切都很好,但它只工作一次。我需要它循环并继续检查。完成 run() 后,我该如何告诉它再次 run()?

public class NotifyService extends Service{

    private long mDoTask;

    NoteThread notethread;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        mDoTask = System.currentTimeMillis();
        notethread = new NoteThread();
        notethread.start(); 
    }


    public class NoteThread extends Thread {
        NotificationManager nManager;
        Notification myNote;

        @Override
        public synchronized void start() {
            super.start();
//init some stuff
        }

        @Override
        public void run() {
                    //If it's been x time since the last task, do it again
            //For testing set to every 15 seconds...
            if(mDoTask + 15000 < System.currentTimeMillis()){

//Take care of business
        mDoTask = System.currentTimeMillis();                   
            }
        }
    }
}

【问题讨论】:

标签: android multithreading loops service


【解决方案1】:

来自 Android 文档:

服务是一个应用程序组件 代表一个应用程序的 渴望进行更长时间的跑步 在不交互的情况下进行操作 用户或提供功能 供其他应用程序使用。每个 服务类必须有 中的相应声明 它的包的 AndroidManifest.xml。 服务可以启动 Context.startService() 和 Context.bindService()。

请注意,服务与其他服务一样 应用程序对象,在主程序中运行 他们的托管过程的线程。这 意味着,如果您的服务正在进行 做任何 CPU 密集型(例如 MP3 播放)或阻塞(例如 网络)操作,它应该 产生它自己的线程来做 那项工作。有关此的更多信息 可以在进程和线程中找到。 IntentService 类可用 作为标准实施 有自己的线程的服务 它安排了要完成的工作。

你可以找到详细的讨论 关于如何在 服务文件。

换句话说,一个服务不会在后台运行,除非你把它放在一个线程中。如果您在没有手动线程化服务的情况下将永远不会结束的服务放入应用程序,那么它阻塞。

Android 提供了一个 API 来为您执行后台任务,而无需使用 Java 线程;它被称为AsyncTask,它是 Android 团队做出的为数不多的优秀设计决策之一。

编辑我忘了回答你关于多线程的问题。您不想让线程多次执行其run() 方法。要么实例化一个新线程,要么在你想要重复的 run 逻辑的内容周围放置一个 while 循环。

【讨论】:

    【解决方案2】:

    要更好地理解线程,请阅读 Brian Goetz 的“Java Concurrency In Practice”。

    为了更好地理解服务,我认为您应该将它们编写为单线程,并让您部署它们的 Java EE 容器来处理线程问题。与让您的代码承担为用户管理线程的负担相比,池化 servlet 是一种更好的解决方案。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 2012-07-19
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2017-12-12
    相关资源
    最近更新 更多