将创建线程的类转换为Service

时间:2012-08-16 10:59:57

标签: android multithreading service

我有class创建线程,但我希望将class转换为Service,希望它不会在方向更改时被销毁。

这是班级:

public class Getter {

    private final String ip;
    private final int amount, poolSize;
    private Vector<Integer> results = new Vector<Integer>();
    private final ExecutorService es;
    private Collection<Future<?>> futures = new LinkedList<Future<?>>();


    public Getter(String ip, int amount, int poolSize) {
        this.ip = ip;
        this.amount = amount;
        this.poolSize = poolSize;
        es = Executors.newFixedThreadPool(this.poolSize);

    }

    public boolean working() {
        boolean work = false;
        for (Future<?> future : futures) {
            if (!future.isDone()) {
                work = true;
            }
        }
        return work;
    }

    public Vector<Integer> getResults() {
        Collections.sort(results);
        return results;
    }

    public int threads(){
        return poolSize;
    }

    public void start() {

        for (int i = 0; i <= amount; i++) {
            futures.add(es.submit(new Get(ip)));
        }

        es.shutdown();

    }

    public void stop(){
        for (Future<?> future : futures) {
            future.cancel(true);
        }
    }

    private class Get implements Runnable { 

        private String ip;

        private Get(String ip) {
            this.ip = ip;
        }

        public void run() {
            try {
                // network stuff
                // adds result to results Vector.
            } catch (Exception ex) {

            }
        }
    }                                       
}

这个class也可以转换为Service,这样一旦它开始就可以在后台运行吗?

3 个答案:

答案 0 :(得分:0)

是。我认为这会很好IntentService。您的下一个最佳选择可能是AsyncTask

更多:

一般来说,我会说,如果后台任务的行为与启动它的任何内容(例如,Activity,Fragment,Service等)密切相关,那么将其作为AsyncTask。如果它是独立的并且意味着以模块化方式提供多个不同的组件,请将其作为服务。在任何一种情况下,AsyncTask或IntentService都很容易制作。

答案 1 :(得分:0)

您可以将其添加到清单文件中,以阻止您的应用在方向更改时被销毁:

android:configChanges="orientation"

但是如果你想提供服务,那么只需复制这个例子: http://developer.android.com/reference/android/app/Service.html 您可以将该类添加到服务,然后只需添加一个访问您的服务连接。

您还可以向清单文件中添加内容,以便在设备开启时启动服务 看这里 Trying to start a service on boot on Android

答案 2 :(得分:0)

如果您想要“无论什么”运行Service,您可能需要将其设置为 foreground