gpt4 book ai didi

android - 在纯服务应用程序中使用 SpeechRecognizer。在主线程上运行代码

转载 作者:行者123 更新时间:2023-11-29 00:16:35 25 4
gpt4 key购买 nike

我正在开发一个仅作为服务运行的应用程序。也就是说,它没有 Activity(至少通常会运行),并且在任何给定时刻,应用程序中唯一(通常)运行的组件是服务。这意味着在屏幕锁定时使用。它已经有效。

在这种情况下,我似乎理解服务的线程应用程序的“主线程”,即使它不是 UI 线程本身(因为没有 UI)。

问题是:如果服务使用 HandlerThread,我可以从 HandlerThread 调用的方法中调用 runOnUIThread() ?这会使其从主线程运行,而无需启动 Activity(这将涉及解锁屏幕)吗?

基本上我的问题是我需要使用 SpeechRecognizer,从服务中启动它。现在我的服务正在 HandlerThread 上使用 Handler。当尝试从 HandlerThread(间接)调用的方法初始化 SpeechRecognizer 时,出现异常,因为 SR 必须从主线程运行。

我可以使用 runOnUIThread() 吗?

我看到这里有一个类似的问题:How to invoke Speechrecognizer methods from service with no main thread or activity
但是,答案涉及从 onCreate()onStartCommand() 调用 SR,这在我的情况下不可行。

更新:显然,我可以调用runOnUIThread(),因为它是Activity的一个方法.那么有没有办法让一些调用在主线程上运行,在这种情况下不是 UI 线程?

最佳答案

这个答案不是特定于语音识别器的,这就是它作为评论开始的原因,但需要更多的空间来澄清......

Handler mainHandler;
public void onCreate() {
super.onCreate();
mainHandler = new Handler(); // this is attached to the main thread and the main looper
// ...
}

// anywhere in a background thread:
mainHandler.post(new Runnable() {
// ...
});

此代码创建一个附加到主线程的处理程序。从后台线程发布到此处理程序将根据需要在主线程上运行代码。

我没有使用 SpeechRecognizer,所以我不能保证它会解决问题,但看起来应该会。

编辑:更多细节

我想到的解释一些重要想法的文章是 The Android Event Loop .特别是它链接到这段代码,它显示了如何通过发布到 Handler 来实现 runOnUiThread,正如我在这里建议的那样:

 /**
* Runs the specified action on the UI thread. If the current thread is the UI
* thread, then the action is executed immediately. If the current thread is
* not the UI thread, the action is posted to the event queue of the UI thread.
*
* @param action the action to run on the UI thread
*/
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}

关于android - 在纯服务应用程序中使用 SpeechRecognizer。在主线程上运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26330261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com