2012-07-09 94 views
1

因此,這裏就是發生的事情:我使用的是runOnUiThread()方法時,該類從其他手機接收到一條消息改變從另一個類的形象圖。我使用mainclass.runOnUiThread(new Runnable ...)來調用它,等等。它在第一次運行應用程序時運行,但當我點擊後退按鈕退出應用程序,然後再次啓動應用程序時,Image View不再更新。我拍攝的日誌顯示,一切正常並正在運行,但Image View不會更改。我沒有收到任何錯誤,在運行應用程序時它不會崩潰,它只是不更新​​Image View。任何想法可能會造成這種情況?runOnUiThread停止工作,當應用程序被破壞

編輯*:所以這就是我實際使用來改變一個類的ImageView的大小不活動

peerActivity.runOnUiThread(

           new Runnable(){ 

            @Override 
            public void run() { 
             Log.v("[email protected]", "Thread is running"); 
             Log.v("[email protected]", decodedImage.toString()); 
             // TODO Auto-generated method stub 
             peerActivity.ivPhoto.setImageBitmap(decodedImage); 
             Log.v("[email protected]", "Past UI Change"); 

            } 

           }); 

凡peerActivity持有其他類的引用和ivPHoto是圖片瀏覽。我想我需要做的是在程序關閉時找到一種殺死該線程的方法(當我進入程序管理器時,它仍然具有「強制關閉」按鈕)。有沒有辦法做到這一點?

Edit2 *:所以我嘗試了一系列不同的方法來處理UI線程,它們都給了我相同的結果:程序在第一次運行時完美運行,但是當我點擊後退按鈕並關閉它時,重新打開它,Image View不再更新。如果我強制關閉應用程序,它會再次正常工作,直到我關閉並重新打開它。

+0

我猜你是在一個單獨的線程解碼圖像。你在使用'AsyncTask'嗎?如果不是的話,你一定要轉向那個; http://developer.android.com/reference/android/os/AsyncTask.html 它將解決您的問題,因爲您將解碼圖像返回到onPostExecute()方法並將其設置在那裏。 onPostExecute()和onPreExecute()和onProgressUpdate()都在UI線程中運行,並且應該始終工作。 – 2012-07-10 17:49:36

回答

2

嘗試使用View.post(...)代替。

+0

剛剛嘗試過,沒有工作。還試着用處理程序得到了相同的結果。 – user1513272 2012-07-10 13:48:01

0

我使用新的處理程序(Looper.getMainLooper())後(...)。

你甚至可以從後臺線程創建此。

0

它看起來像你的Runnable被關閉到活動爲您提供參考。當您按回來然後再次開始您的活動時,您的舊活動將被銷燬並創建一個新實例。您的後臺線程將繼續更改已不存在的原始活動,因此對其視圖所做的更改不起作用。

您需要在活動暫停或適當停止時停止更新線程,並在活動恢復或開始時重新啓動(再次,如適用),並確保始終更新實際的活動可見。