Toast消息不会显示

时间:2014-01-12 13:57:53

标签: java android toast

嘿我有一个没有出现的吐司消息的问题。我正在创建一个将用户的消息显示为摩尔斯电码的应用程序,我想要显示的消息显示,以告知现在哪个字符被显示。但是,当我把它放在下面时,吐司消息不会显示出来。这可能是因为调用的下一个函数以某种方式杀死了前一个函数,因为当我删除其他命令时只留下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();
    }

}

但是在等待发布之前仍然不知道如何展示吐司。

2 个答案:

答案 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();