2015-09-20 129 views
0

在我的Android應用程序中,有一個線程處理一些繁重的工作,然後使用處理程序更新UI。但是,啓動一段時間後,線程會突然停止,沒有任何信號或異常拋出。我不知道它是如何發生的。這是一個關於通過我自己的線程和UI線程訪問相同變量的併發問題嗎?以下是線程和處理程序的代碼。Android線程突然停止

TextView textViewFromActivity; 
String valueFromThread; 

public void startThread() { 
    thread.start(); 
} 

public Handler handler = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
     if(valueFromThread != null && valueFromThread != "") { 
      textViewFromActivity.setText(valueFromThread); 
     } 
    } 
} 

public Thread thread = new Thread() { 
    public void run() { 
     while(true) { 
      doHeavyWorkAndUpdateValueFromThread(); 
      handler.sendEmptyMessage(0); 
     } 
    } 
} 

更新:

以下線路時,文本視圖停止更新顯示在logcat中。

的logcat:

09-20 12:38:32.379: I/Choreographer(32250): Skipped 30 frames! The application may be doing too much work on its main thread. 
09-20 12:38:33.441: I/Choreographer(32250): Skipped 32 frames! The application may be doing too much work on its main thread. 
09-20 12:38:34.006: I/Choreographer(32250): Skipped 33 frames! The application may be doing too much work on its main thread. 
09-20 12:38:34.640: I/Choreographer(32250): Skipped 36 frames! The application may be doing too much work on its main thread. 
09-20 12:38:40.496: I/art(32250): WaitForGcToComplete blocked for 21.575ms for cause HeapTrim 
09-20 12:38:58.146: I/art(32250): Background sticky concurrent mark sweep GC freed 132986(4MB) AllocSpace objects, 0(0B) LOS objects, 16% free, 16MB/19MB, paused 8.544ms total 42.510ms 
09-20 12:39:10.765: I/art(32250): WaitForGcToComplete blocked for 8.361ms for cause HeapTrim 
09-20 12:39:14.306: I/art(32250): Background sticky concurrent mark sweep GC freed 125390(3MB) AllocSpace objects, 0(0B) LOS objects, 17% free, 15MB/19MB, paused 5.645ms total 41.015ms 
+0

請張貼一些logcat的。 – Tauqir

+0

發佈,以上線時顯示的文本視圖停止更新。 –

+0

有你用'findviewbyid'初始化'textViewFromActivity'' – Tauqir

回答

0

沒有更多的信息(日誌輸出,您是如何運行的應用程序的說明等),我們只能猜測。

  • 如果您的應用程序正在發生改變方向時,有可能你的線程現在指的是倒閉的處理程序
  • 是有可能doHeavyWorkAndUpdateValueFromThread()尚未完成?
0

這裏沒有足夠的信息來解決問題,所以這將是一個非常通用的答案。從你已經發佈什麼,我猜想,你的工作線程實際上得到正常執行的地方卡住了,也許在一個循環或等待服務器響應...

這是我的通用的答案:

使用調試器。我知道它一開始並不熟悉,但學習使用它是,所以值得。

在這種情況下,您將能夠看到線程是否仍然存在(在線程構造函數中添加一個好名字(例如new Thread("heavy work thread")以幫助找到正確的名稱)以及調用堆棧的當前執行情況。

您也可以暫停線程檢查當前變量和其他條件可能導致它無限循環。