我有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
,这样一旦它开始就可以在后台运行吗?
答案 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 。