我的應用程序正在啓動一個持續運行的線程,運行一段時間(true){}。當我重新打開/重新輸入應用程序時,會創建另一個線程並與之前同時運行。我想要一個可以檢查前一個會話中的線程是否仍在運行的機制,如果這樣做,則不應該重新創建它。如何實現這一目標?如何在重新打開應用程序時檢查前一個會話的線程是否仍在運行?
回答
在你的線程創建一個
Boolean isRunning = false;
當你的線程開始 把它放在共享偏好這樣的應用..
isRunning = true;
SharedPreferences settings = getSharedPreferences("isThreadRunning", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("isRunning", isRunning);
editor.commit();
現在,當線程完成只是改變它回到錯誤。
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.
}
這是一個非常簡單的方法來做到這一點。
希望它有幫助
線程完成並設置爲false後,請確保將它放入捆綁軟件中,就像我在第一行代碼中所做的那樣。 – 2011-12-16 16:17:20
感謝這似乎是一個非常好的和簡單的解決方案,SharedPreferences關閉時持續發生?因爲如果這樣做,那麼即使該線程被關閉而終止,我的isRunning也會始終設置爲true。 – Miky 2011-12-16 16:46:00
單向性:使用簡單的布爾值創建一個首選項文件來說是否運行。
http://developer.android.com/guide/topics/data/data-storage.html#pref
謝謝,我在想它,但想看看其他人的建議:) – Miky 2011-12-16 16:14:17
我寫了一個簡單的線程列表,然後回來。 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);
}
}
您可以使用ServerSocket綁定到端口。一次,操作系統將只允許綁定一個線程。這將防止下一個不執行。
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方法或其他唯一標識其類型的東西。
- 1. 如何檢查應用程序是否在瀏覽器會話中打開?
- 2. 檢查當前的WPF應用程序是否正在運行?
- 3. 如何檢查一個線程是否在C#中運行?
- 4. 是否會調用window.setInterval在chrome中打開一個新線程?
- 5. 當應用程序池仍在運行時,是否會終止長時間運行的線程
- 6. 檢查應用程序是否在前臺運行
- 7. 如何檢查Android應用程序是否第一次打開
- 8. Spring/Hibernate:爲線程保持會話打開,還是打開一個新線程?
- 9. 如何檢查應用程序是否真的在運行?
- 10. 如何在調用Process.GetProcessById之前檢查進程是否仍在運行?
- 11. 如何在應用程序(活動)仍在運行時刷新?
- 12. 檢查另一個窗體中的線程是否仍在運行
- 13. 如何檢查WPF應用程序是否已在運行?
- 14. android:如何檢查應用程序是否在後臺運行
- 15. 檢查文件是否在任何應用程序中打開
- 16. 如何檢查應用程序是否正在運行,否則運行它?
- 17. 如何檢查進程是否仍在c內核中運行?
- 18. 如何檢查子進程是否仍在運行?
- 19. 檢測我的應用程序是否在電話上運行
- 20. 檢測應用程序重新打開?
- 21. 檢查某個特定應用程序是否在運行iOS?
- 22. 如果在線程中運行,urllib2打開程序會掛起
- 23. 如何運行一個程序並在運行程序時定期檢查輸出是否存在
- 24. 檢查會話是否仍然存在
- 25. 檢查一個線程是否仍在使用mac osx上的POSIX線程庫運行
- 26. 檢查程序是否正在運行
- 27. 檢查程序是否正在運行
- 28. 重新啓動應用程序並檢查是否已在運行
- 29. 在AlramManager中如何檢查一個應用程序是打開還是關閉
- 30. 如何在每次打開應用程序時重新啓動應用程序?
@JohnVint是的,他們應該。由於該應用程序在Android設備上運行。忽略手機關機的情況,因爲那些線程無論如何都會被殺死。 – Miky 2011-12-16 16:24:11