android runonuithread()函数没有执行

时间:2013-07-08 11:11:46

标签: android

我正在开发一个使用名为flite的第三方tts的应用程序。我正在做一些像tts说句子的事情。我想突出显示每个单词。为此,我设法从tts获得了单词级回调。 工作流程是这样的 - 按下“说话文本”按钮。它启动tt 服务,然后它将文本发送到使用C语言并与应用程序结合的flite tts。 现在,从C代码开始,在每个单词之后,我对两个不同的java活动进行两次回调: 一个到tts服务说出这个词 第二个是我的测试java活动来突出显示这个词。 我在测试活动中成功获得了单词级回调,但之后我无法进行任何UI工作。

以下是我收到回调时执行的代码: 这是从C代码调用的函数。

private void WordCallback(int isword) {// from
    // callback
    if (isword == -1) {
        Log.d(LOG_TAG, "its not a word");
    } else if (isword == -2) {
        Log.d(LOG_TAG, "yeah..its the end");
    } else {
        Log.d(LOG_TAG, "its word no " + isword);

        int word = isword;
        Log.d(LOG_TAG, "highlightwords");
        highlightwords(isword);

        if (isword == 4) {
            Log.d(LOG_TAG, "in if");

            new Thread(new Runnable() {
                @Override
                public void run() {
                    Log.d(LOG_TAG, "thread started");
                    try {
                        Flitetest.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Log.d(LOG_TAG, "run on ui");
                                textview.setText("#" + isword);
                            }
                        });
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }    
}

FliteTest是活动的名称。 日志打印到“线程已启动”,但runonuithread()内的代码永远不会执行,也没有错误。

此外,如果没有线程和runonuithread()写textview.settext("something"),它会给出错误:

fatal signal 11(sigsegv) at 0x6fc64e87(code=1), thread 20292(SynthThread)

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

在Android ICS (4.0+)上,如果android:anyDensity=false AND 中有AndroidManifest.xml,则表示您已在ICS手机上强制启用GPU渲染。这对于原生Android应用程序也是一个问题。 您可以选择不使用android:anyDensity=false选项,也可以禁用手机上的强制GPU渲染。由于你无法在其他人的手机上真正控制后者,前者似乎是最好的解决方案。请记住在dp之后使用“dimensions”后缀。