帮助我学习如何正确使用服务和线程

时间:2011-05-24 02:03:31

标签: android multithreading loops service

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

我不是要求很长的解释,而是更多的确认。如果我错了,那就好了。我在这里学习。

如果我理解正确: 1.服务在后台运行(没有UI)。 2.理论上服务将永远运行直到它自杀(我在这里做了一个很大的猜测) 3.即使主要活动不可见,服务也会继续运行(甚至毁坏了怎么样?)

所以这是我的编码问题。

我有我的服务设置和线程。一切都很好,但只能工作一次。我需要它循环并继续检查。一旦完成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();                   
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

来自Android文档:

  

服务是一个应用程序组件   代表一个应用程序   渴望执行更长时间的运行   操作时不与之交互   用户或提供功能   供其他应用程序使用。每   服务类必须有一个   相应的声明   它的包的AndroidManifest.xml。   服务可以开始   Context.startService()和   Context.bindService()。

     

注意服务,像其他   应用程序对象,在main中运行   他们的托管过程的线程。这个   意味着,如果您的服务正在进行中   做任何CPU密集型(如MP3)   播放)或阻止(例如   网络)运营,它应该   产生自己的线程来做   那工作。更多信息   可以在进程和线程中找到。   IntentService类可用   作为标准实施   服务有自己的线程在哪里   它计划完成它的工作。

     

您可以找到详细的讨论   关于如何在中创建服务   服务文件。

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

Android提供了一个API来为您完成后台任务,而无需使用Java线程;它被称为AsyncTask,它是Android团队有史以来为数不多的GOOD设计决策之一。

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

答案 1 :(得分:0)

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

为了更好地理解服务,我认为您应该将它们编写为单线程,并让您部署它们的Java EE容器来处理线程问题。汇集的servlet比让代码承担管理用户线程的负担更好。