嘿我有一个没有出现的吐司消息的问题。我正在创建一个将用户的消息显示为摩尔斯电码的应用程序,我想要显示的消息显示,以告知现在哪个字符被显示。但是,当我把它放在下面时,吐司消息不会显示出来。这可能是因为调用的下一个函数以某种方式杀死了前一个函数,因为当我删除其他命令时只留下showStatus()
消息出现。
我该如何处理这种情况?
public void dispDot()
{
final Parameters pM = cameraMorse.getParameters();
pM.setFlashMode(Parameters.FLASH_MODE_TORCH);
cameraMorse.setParameters(pM);
MorseActivity.backgroundMorse.setBackgroundResource(R.drawable.background1on);
waitFor(1);
pM.setFlashMode(Parameters.FLASH_MODE_OFF);
cameraMorse.setParameters(pM);
MorseActivity.backgroundMorse.setBackgroundResource(R.drawable.background1a);
}
//function that displays the line in Morse code
public void dispLine()
{
final Parameters pM = cameraMorse.getParameters();
pM.setFlashMode(Parameters.FLASH_MODE_TORCH);
cameraMorse.setParameters(pM);
MorseActivity.backgroundMorse.setBackgroundResource(R.drawable.background1on);
waitFor(3);
pM.setFlashMode(Parameters.FLASH_MODE_OFF);
cameraMorse.setParameters(pM);
MorseActivity.backgroundMorse.setBackgroundResource(R.drawable.background1a);
}
public void showStatus(char character)
{
//status1.setTextColor(Color.WHITE);
//status1.setText("Status: Now displaying "+character);
toast = Toast.makeText(MorseActivity.this, "Displaying "+character,Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, 0, 30);
toast.show();
}
public void morseMessageTranslator()
{
morseMessage = textBox.getText().toString();
morseMessage = morseMessage.toUpperCase();
if(morseMessage.length()>0)
{
char character;
for(int a=0;a<morseMessage.length();a++)
{
character=morseMessage.charAt(a);
switch (character)
{
case 'A': //.-
showStatus('A');
dispDot();waitFor(1);dispLine();waitFor(1);
break;
case 'B': //-...
showStatus('B');
dispLine();waitFor(1);dispDot();waitFor(1);dispDot();waitFor(1);dispDot();waitFor(1);
break;
更新: 好的,事实证明waitFor()函数是原因。
public void waitFor (final int time)
{
Thread waitthread = new Thread(new Runnable() {
// After call for background.start this run method call
public void run() {
try {
Thread.sleep(time*500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
waitthread.start();
try {
waitthread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
但是在等待发布之前仍然不知道如何展示吐司。
答案 0 :(得分:2)
正如您对此问题的评论所示,您的Toasts未展示的原因是您的waitFor()
方法。如上所述,这执行无意义的计算,a)浪费宝贵的CPU时间(因此浪费电池),b)在UI线程上执行此操作。这意味着在UI线程上发生的任何事情都不会一直发生waitFor()
,包括Toasts。
您必须在此处添加某种线程才能解决此问题(Android开发者网站有good tutorial)。您希望dispDot,dispLine和waitFor调用在后台线程上发生。请记住,如果这三种方法中的任何一种与UI交互,则必须在UI线程上执行此操作(请参阅链接教程中的UI线程通信)。
上一个(错误的)回答
您正在创建Toast
,但未在其上调用show()
!这是一个非常容易犯的错误。只需更改一行:
toast = Toast.makeText(MorseActivity.this, "Displaying "+character,Toast.LENGTH_LONG);
到
toast = Toast.makeText(MorseActivity.this, "Displaying "+character,Toast.LENGTH_LONG).show();
答案 1 :(得分:0)
将.show()添加到吐司代码的末尾
toast = Toast.makeText(MorseActivity.this, "Displaying "+character,Toast.LENGTH_LONG).show();