我的应用程序正在启动一个持续运行的线程,该线程运行一段时间(true){}。当我重新打开/重新进入应用程序时,会创建另一个线程并与之前的线程同时工作。我想要一种机制,可以检查来自前一个会话的线程是否仍在运行,如果是,那么它不应该重新创建它。如何实现?
答案 0 :(得分:1)
一种方法:创建一个带有简单布尔值的首选项文件,以表示是否运行 http://developer.android.com/guide/topics/data/data-storage.html#pref
答案 1 :(得分:1)
在你的主题中创建一个
Boolean isRunning = false;
当你的线程开始时 把它放在这样的应用程序共享首选项中..
isRunning = true;
SharedPreferences settings = getSharedPreferences("isThreadRunning", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("isRunning", isRunning);
editor.commit();
现在线程完成后,只需将其更改为false。
isRunning = false;
在你的活动中,只需将布尔值从共享偏好中拉出来。
SharedPreferences settings = getSharedPreferences("isThreadRunning", 0);
boolean running = settings.getBoolean("silentMode", false); //if it doesnt exist it will automatically set to false which means the thread hasnt or isnt running
then just test.
if(running){
//Do something
}else{
//the thread isnt running so lets start it.
}
这是一种非常简单的方法。
希望有所帮助
答案 2 :(得分:1)
我写了一个简单的线程列出了一段时间。 user1031312有一个更好的解决方案,但无论如何它都是对你有用的。不确定它是否会列出前一个会话中的线程。它将在名为thread_textview的TextView中列出线程名称和id。
// This method recursively visits all thread groups under 'group'.
public static void visit(ThreadGroup group, int level) {
// Get threads in 'group'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads*2];
numThreads = group.enumerate(threads, false);
// Enumerate each thread in 'group'
for (int i=0; i<numThreads; i++) {
// Get thread
thread_textview.append("-> "+threads[i].getName()+":"+threads[i].getId()+"\n");
}
// Get thread subgroups of 'group'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups*2];
numGroups = group.enumerate(groups, false);
// Recursively visit each subgroup
for (int i=0; i<numGroups; i++) {
visit(groups[i], level+1);
}
}
答案 3 :(得分:1)
您可以使用ServerSocket绑定到端口。 OS一次只允许绑定一个线程。这将阻止下一个不执行。
ServerSocket serverSocket = new ServerSocket(1234);
对于下一个线程,它将抛出BindException。所以你的线程第一行就可以做你想要的了。
P.S。 1234是未使用的端口号。
另一种选择 - 上面的答案可能不适合你想要的,所以这里是另一种选择。
public MyThreadFactory {
List<String> runningThreads = new List<String>();
public synchronized void startThread(MyThread thread) {
if (! runningThreads.contains(thread.getID())) {
runningThreads.add(thread.getID());
// MyThread implements Runnable
new Thread(thread).start();
}
}
}
假设您的线程对象具有getID方法或唯一标识其类型的内容。