Android线程突然停止

时间:2015-09-20 04:09:20

标签: java android multithreading android-handler

在我的Android应用程序中,有一个线程处理一些繁重的工作,然后使用处理程序更新UI。但是,在启动一段时间后,线程将突然停止,不会抛出任何信号或异常。我不知道它是如何发生的。是否是由我自己的线程和UI线程访问相同变量的并发问题?下面是线程和处理程序的代码。

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

1 个答案:

答案 0 :(得分:0)

我们这里没有足够的信息来解决问题,所以这将是一个非常通用的答案。根据你发布的内容,我猜你的工作线程实际上在正常执行中被卡住了,可能是在循环中或等待服务器回复......

这是我的通用答案:

使用调试器。我知道它一开始并不熟悉,但学会使用它是所以值得。

在这种情况下,您将能够看到您的线程是否仍然存在(在您的线程构造函数中添加一个好名称(如new Thread("heavy work thread")以帮助找到正确的线程),以及callstack目前的执行情况。

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