2015-09-20 221 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")以帮助找到正确的名称)以及调用堆栈的当前执行情况。

您也可以暂停线程检查当前变量和其他条件可能导致它无限循环。