2016-05-16 53 views
0

如果我離開一個線程運行時,我退出我的android應用程序,我可以訪問該線程時,應用程序重新啓動?我知道該線程仍然與我的應用程序相關聯,因爲我可以通過設置-apps-force stop來殺死它。應用程序退出後找到android線程

更多細節:我的應用程序通過藍牙連接到設備。當我旋轉平板電腦,它重新啓動應用程序,但如果我不停止所有線程,舊的線程重新連接到設備和應用程序無法連接到一個新的線程。

我已經解決了基本問題,不允許應用程序屏幕旋轉,並通過殺死連接線程onDestroy()。但我想知道如何重新連接那種殭屍線程出於好奇。

我可以看到Thread.enumerate()中無法識別的線程,但我不知道如何訪問這些線程,除了查看名稱和狀態。

回答

0

我在應用程序中處理這個問題的方式是覆蓋活動的onRetainCustomNonConfigurationInstance()方法,該方法允許您在屏幕旋轉時通過重新啓動來保留對象。以下是我如何實現它。

我有一個執行Web請求的AsyncTask。 AsyncTask在一個單獨的文件中,並且將對調用Activity的引用作爲我已經實現的一些回調的偵聽器。因此,對於我的Web請求的AsyncTask的構造是這樣的:

private Callbacks listener; 

public WebRequest(Callbacks listener) { 
    this.listener = listener; 
} 

我實現onRetainCustomNonConfigurationInstance()在我的活動是這樣的:

@Override 
public Object onRetainCustomNonConfigurationInstance() { 
    if(webRequest != null) { 
     webRequest.detachFromActivity(); 
     return webRequest; 
    } else { 
     return null; 
    } 
} 

現在,當我的屏幕旋轉時,活動重新啓動,如果我的AsyncTask正在運行,它會在這裏保存對它的引用。請注意,我也將「我的任務」從當前的「活動」中分離出來,該活動現在將被銷燬。我通過讓偵聽器(這是當前的Activity)爲空來實現我的任務。就像這樣:

public void detachFromActivity() { 
    listener = null; 
} 

現在,當活動重新啓動,在onCreate(),我檢查,看看是否有一個保留提及我正在運行的線程調用getLastCustomNonConfigurationInstance()這樣的:

Object retainedRequest = getLastCustomNonConfigurationInstance(); 
if(retainedRequest != null) { 
    if(retainedRequest instanceof WebRequest) { 
     webRequest = (WebRequest) retainedRequest; 
     webRequest.setListener(this); 
    } 
} 

由於參考我的運行線程作爲Object傳遞,我需要將它作爲Object檢索,然後檢查它是否是我的AsyncTask的實例,然後如果是的話就進行轉換。

最後一步是將回調「重新連接」到剛剛創建的這個NEW活動,以便任務知道發送結果的位置。我用的是setListener(this)方法來做到這一點在我的任務,像這樣:

public void setListener(Callbacks listener) { 
     this.listener = listener; 
} 

現在我可以參考重新連接到舊線與新重新創建活動。您可能沒有使用AsyncTask,但概念是相同的,並且應該適用於任何線程或任何您想要的對象。

希望這會有所幫助!

0

m not sure on your question, but what you are doing is kinda wrong. Screen rotation are UI changes and they should not affect your other code. Check this answer for some guidance- http://stackoverflow.com/questions/5913130/dont-reload-application-when-orientation-changes PS: NoChinDeluxe的回答也很適合去耦UI與其他元素

0

的基本問題,因爲你已經發現,是你已經在你的藍牙連接在邏輯上必然的這樣一種方式來實現您的應用程序活動(即活動負責跟蹤線程處理藍牙活動)。

爲了讓藍牙連接參考在一個循環中生存下來,您需要將其與活動分離。有很多方法可以做到這一點,具體取決於您的要求。

例如,您可以將藍牙代碼作爲服務來實現。 還有其他的方法 - 例如,看看Activity restart on rotation Android

+0

謝謝。第二個回覆中的博客文章(使用保留的片段)似乎正是我所需要的。 –