2014-03-02 37 views
1

我有一個線程,我想讓用戶在點擊進度通知時殺死那個線程。殺死線程而不訪問線程對象

我的通知工作正常,但在我的BroadcastReciever我無法設法殺死線程。我不能使用thread.interupt(),因爲我沒有訪問線程對象的權限。這也意味着我不能使用公共布爾值來終止線程。

我也嘗試傳入進程ID作爲額外的,並使用Process.killProcess(pid)殺死它,但這有一個相當不幸的副作用,可能會導致我的UI線程和其他可能運行的線程死亡。

最後,我嘗試使用線程ID,但文檔沒有提到使用這個殺死線程。

總之,我該如何使用可作爲臨時數據傳遞的原始數據類型來終止我的線程?

+0

線程是進程內運行,你的整個應用程序運行大概一個過程,創建的所有線程的應用程序進程內運行,這就是爲什麼殺死進程沒有按」:從這樣的業務k爲boolean cancel工作。爲什麼你不能訪問線程對象?你可以創建一個帶有靜態字段的靜態類,以便在創建腳本時存儲腳本對象,這個類可以讓你輕鬆訪問任何你想要的線程對象。我很抱歉,但我不知道如何在沒有它們的實例的情況下終止線程,但是如果可能的話,我想找到一個使用線程對象的解決方案。 –

+0

@TimVisee - 我會給一個靜態列表一個鏡頭 - 如果我的應用程序被破壞,線程也會被刪除? - 我很擔心我可能遇到這樣一種情況:對線程的引用將被刪除,並且我無法殺死線程 – jcw

+0

我其實並不確切,我從未編寫過一個Android應用程序,所以是的,我是不能給你這個答案。我假設線程將被銷燬,如果你終止了應用程序進程,它肯定會被銷燬。殺死應用程序線程(而不是其他線程)不應該殺死其他線程,你總是可以試試它!您可能需要將主線程用作其他線程的主線程,您需要讓主線程繼續運行才能夠到達線程實例,據我所知。 [1/3] –

回答

1

你在用錯誤的方法來看它。

如果你有一個線程在通知欄上運行併發出通知,我會假設你有一個服務正在運行,並且這個服務知道該線程並且有一個對它的引用。這樣,您的通知PendinIntent,不應該簡單地觸發一個BroadcastReceiver,但觸發相同的服務與Intent額外表明該服務應該取消線程。

所以假設你的服務:

public MyService extend Service{ 

    private Runnable myThread = new Runnable{ 
    @Override 
    public void run(){ 
     // ... here you're doing the job on the different thread 
    } 
    }; 
} 

類似的東西:

Intent i = new Intent(this, MyService.class); 
i.putExtra("cancel", true); 
PendingIntent pi = PendingIntent.getService(// put here the intent) 

然後,只要單擊通知,您的服務已線程將從onStartCommand被執行,所有你需要要做的是:

cancel = getIntent.getBooleanExtra("cancel", false); 

然後裏面的線程你必須chec

public MyService extend Service{ 

    boolean cancel = false; 

    private Runnable myThread = new Runnable{ 
    @Override 
    public void run(){ 
     // ... here you're doing the job on the different thread 

     if(cancel) 
     return; 
    } 
    }; 
} 
+0

我的線程現在沒有從服務運行,但看起來像正確的路線。我會看到如何去 – jcw

+0

絕對是的。如果在活動被破壞後應該繼續運行,請將其放入服務中。 – Budius

+0

這個工作 - 它只是花了一點時間玩(因爲我可以同時運行多個線程)。 – jcw

1

正確的方法是從內部停止它。這意味着您在控制器內定義了一個控制器(例如,boolean),用於檢查應用程序中的一些其他事件,以確定Thread是否必須仍然執行。這意味着你必須把你的代碼放在一個內部有Thead.sleep()對象的循環中,以防止過度殺傷你的線程,或者在裏面使用Handler內部的postDelay()動作,但這就是方法。

如果你不想使用它,你也可以在裏面聲明一個BroadcastReceiver。您註冊您的接收器,然後等待您定義的某個動作(我建議您採取自己的操作,以免干擾Android),一旦您的接收事件觸發,只需在Thread中使用return,然後退出。