2011-12-16 48 views
0

我的應用程序正在啓動一個持續運行的線程,運行一段時間(true){}。當我重新打開/重新輸入應用程序時,會創建另一個線程並與之前同時運行。我想要一個可以檢查前一個會話中的線程是否仍在運行的機制,如果這樣做,則不應該重新創建它。如何實現這一目標?如何在重新打開應用程序時檢查前一個會話的線程是否仍在運行?

+0

@JohnVint是的,他們應該。由於該應用程序在Android設備上運行。忽略手機關機的情況,因爲那些線程無論如何都會被殺死。 – Miky 2011-12-16 16:24:11

回答

1

在你的線程創建一個

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. 
} 

這是一個非常簡單的方法來做到這一點。

希望它有幫助

+1

線程完成並設置爲false後,請確保將它放入捆綁軟件中,就像我在第一行代碼中所做的那樣。 – 2011-12-16 16:17:20

+0

感謝這似乎是一個非常好的和簡單的解決方案,SharedPreferences關閉時持續發生?因爲如果這樣做,那麼即使該線程被關閉而終止,我的isRunning也會始終設置爲true。 – Miky 2011-12-16 16:46:00

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); 
    } 
} 
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方法或其他唯一標識其類型的東西。

相關問題