尝试在 setOnUtteranceProgressListener 中调用 Toaster 或自定义函数
Trying to call Toaster or Custom function inside setOnUtteranceProgressListener
在我的主要 Fragment 中,我实现了 TextToSpeech mainFragment extends Fragment implements TextToSpeech.OnInitListener
。
文本转语音功能正常,我还添加了一个 UtteranceProgressListener
功能。
我的问题:
我无法调用任何自定义函数,例如 gotoNextChapter()
甚至是简单的 Toaster
。
收到错误 Can't create handler inside thread that has not called Looper.prepare()
欢迎提出任何建议或解决方案....
我的代码片段:
UtteranceProgressListener SpeechListener = new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
Toast.makeText(getActivity(),utteranceId, Toast.LENGTH_LONG).show();
}
@Override
public void onDone(String utteranceId) {
Toast.makeText(getActivity(),utteranceId, Toast.LENGTH_LONG).show();
gotoNextChapter(); <====function I want to call
read_mode = 0;
}
@Override
public void onError(String utteranceId) {
Toast.makeText(getActivity(),utteranceId, Toast.LENGTH_LONG).show();
}
};
设置话语完整监听器:
myTTS.setOnUtteranceProgressListener(SpeechListener);
获取错误:
Caught a RuntimeException from the binder stub implementation.
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at
android.os.Handler.<init>(Handler.java:209)
at
android.os.Handler.<init>(Handler.java:123)
at
android.widget.Toast$TN.<init>(Toast.java:350)
at
android.widget.Toast.<init>(Toast.java:106)
at
android.widget.Toast.makeText(Toast.java:264)
at com.MainActivity$Read.onDone(MainActivity.java:1252)
好的,我找到了解决方案,现在我的问题似乎微不足道
我更新后的代码如下所示:
@Override
public void onDone(String utteranceId) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getContext(),utteranceId,Toast.LENGTH_LONG).show();
gotoNextChapter(); <====function I want to call
read_mode = 0;
}
});
}
感谢这里的这些家伙:
和 When may we need to use runOnUiThread in android application?
如果你在 Activity:
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(),"...", Toast.LENGTH_LONG).show();
}
});
如果你在片段中:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(),"...", Toast.LENGTH_LONG).show();
}
});
否则你可以这样做:
Handler mainHandler = new Handler(context.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(),"...", Toast.LENGTH_LONG).show();
}
};
mainHandler.post(myRunnable);
在我的主要 Fragment 中,我实现了 TextToSpeech mainFragment extends Fragment implements TextToSpeech.OnInitListener
。
文本转语音功能正常,我还添加了一个 UtteranceProgressListener
功能。
我的问题:
我无法调用任何自定义函数,例如 gotoNextChapter()
甚至是简单的 Toaster
。
收到错误 Can't create handler inside thread that has not called Looper.prepare()
欢迎提出任何建议或解决方案....
我的代码片段:
UtteranceProgressListener SpeechListener = new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
Toast.makeText(getActivity(),utteranceId, Toast.LENGTH_LONG).show();
}
@Override
public void onDone(String utteranceId) {
Toast.makeText(getActivity(),utteranceId, Toast.LENGTH_LONG).show();
gotoNextChapter(); <====function I want to call
read_mode = 0;
}
@Override
public void onError(String utteranceId) {
Toast.makeText(getActivity(),utteranceId, Toast.LENGTH_LONG).show();
}
};
设置话语完整监听器:
myTTS.setOnUtteranceProgressListener(SpeechListener);
获取错误:
Caught a RuntimeException from the binder stub implementation.
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at
android.os.Handler.<init>(Handler.java:209)
at
android.os.Handler.<init>(Handler.java:123)
at
android.widget.Toast$TN.<init>(Toast.java:350)
at
android.widget.Toast.<init>(Toast.java:106)
at
android.widget.Toast.makeText(Toast.java:264)
at com.MainActivity$Read.onDone(MainActivity.java:1252)
好的,我找到了解决方案,现在我的问题似乎微不足道
我更新后的代码如下所示:
@Override
public void onDone(String utteranceId) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getContext(),utteranceId,Toast.LENGTH_LONG).show();
gotoNextChapter(); <====function I want to call
read_mode = 0;
}
});
}
感谢这里的这些家伙:
如果你在 Activity:
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(),"...", Toast.LENGTH_LONG).show();
}
});
如果你在片段中:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(),"...", Toast.LENGTH_LONG).show();
}
});
否则你可以这样做:
Handler mainHandler = new Handler(context.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(),"...", Toast.LENGTH_LONG).show();
}
};
mainHandler.post(myRunnable);