单键多动作

时间:2016-12-02 10:27:36

标签: android

我使用单个按钮完成两项任务。

  1. Watson Conversation。
  2. Watson Text to Speech。
  3. 我的代码只有在我的TextView有一些文本名称(字符串)时才会执行,但即使在手机用户界面上的TextView显示屏上更新了新的对话响应,文本到语音也在播放最后一个对话响应。继续此操作这里Race condition with UI thread issue.

    我也发现,如果我将TextView保持为空,我会收到错误: enter image description here 代码在这里:

    private class ConversationTask extends AsyncTask<String, Void, String> {
        String textResponse = new String();
        @Override
        protected String doInBackground(String... params) {
            System.out.println("in doInBackground");
            MessageRequest newMessage = new MessageRequest.Builder().inputText(params[0]).context(context).build();
            // async
            GLS_service.message("xxxxxxx", newMessage).enqueue(new ServiceCallback<MessageResponse>() {
                @Override
                public void onResponse(MessageResponse response) {
                    context = response.getContext();
                    textResponse = response.getText().get(0);
                    reply.setText(textResponse);
                    System.out.println(textResponse);
                }
                @Override
                public void onFailure(Exception e) {
                }
            });
            return textResponse;
        }
    }
    
    //
    private class WatsonTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(final String... textToSpeak) {
           /* runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(" ");
                }
            });*/
            TextToSpeech textToSpeech = initTextToSpeechService();
            streamPlayer = new StreamPlayer();
            streamPlayer.playStream(textToSpeech.synthesize(textToSpeak[0], Voice.EN_LISA).execute());
            return "Text to Speech Done";
        }
        /*@Override protected void onPostExecute(String result) {
            textView.setText("");
        }*/
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //Register the UI controls.
        input = (EditText) findViewById(R.id.input);
        send = (ImageButton) findViewById(R.id.send);
        textView = (TextView) findViewById(R.id.textView);
        reply = (TextView) findViewById(R.id.reply);
        play = (ImageButton) findViewById(R.id.play);
        new ConversationTask().execute("");
    
        //Button function
        send.setOnClickListener(action3);
    }
    
    
      //five actions on button click
    public void action5() {
        String textResponse = new String();
        System.out.println("Text to Speech:" + reply.getText());
        //textView.setText("");
        WatsonTask task = new WatsonTask();
        task.execute(String.valueOf(reply.getText()));
        //new WatsonTask().execute(reply.getText().toString());
    }
    
    
    View.OnClickListener action3 = new View.OnClickListener() {
        public void onClick(View v) {
            //action here//
            new ConversationTask().execute(input.getText().toString());
            action5();
        }
    };
    

    }

    请帮忙。

2 个答案:

答案 0 :(得分:1)

行动3

View.OnClickListener action3 = new View.OnClickListener() {
    public void onClick(View v) {
        //action here//
        new ConversationTask().execute(input.getText().toString());
    }
};

行动5

public void action5(String replyString) {
    WatsonTask task = new WatsonTask();
    task.execute(replyString);
}

对话任务

private class ConversationTask extends AsyncTask<String, Void, String> {
    String textResponse = new String();
    @Override
    protected String doInBackground(String... params) {
        System.out.println("in doInBackground");
        MessageRequest newMessage = new MessageRequest.Builder().inputText(params[0]).context(context).build();
        // async
        GLS_service.message("xxxxxxx", newMessage).enqueue(new ServiceCallback<MessageResponse>() {
            @Override
            public void onResponse(MessageResponse response) {
                context = response.getContext();
                textResponse = response.getText().get(0);
                reply.setText(textResponse);
                action5(textResponse);
            }
            @Override
            public void onFailure(Exception e) {
            }
        });
        return textResponse;
    }
}

WatsonTask

private class WatsonTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(final String... textToSpeak) {
        reply.setText(textToSpeak[0]);
        TextToSpeech textToSpeech = initTextToSpeechService();
        streamPlayer = new StreamPlayer();
        streamPlayer.playStream(textToSpeech.synthesize(textToSpeak[0], Voice.EN_LISA).execute());
        return textToSpeak[0];
    }
}

为了完整起见,请注意Marcin Jedynak的评论

答案 1 :(得分:0)

我认为您的计划方案将遵循下一个序列:

  1. 输入文字到对话任务。

  2. GLS_service.message()获取对话结果。

  3. 输入序列2的结果,以发出声音。

  4. 因此,请尝试更改此代码。

    // There is no need to return String. Just send result to TextToSpeech.
    //private class ConversationTask extends AsyncTask<String, Void, String> {
    private class ConversationTask extends AsyncTask<String, Void, Void> {
        String textResponse = new String();
        @Override
        protected String doInBackground(String... params) {
            System.out.println("in doInBackground");
            MessageRequest newMessage = new MessageRequest.Builder().inputText(params[0]).context(context).build();
            // async
            GLS_service.message("xxxxxxx", newMessage).enqueue(new ServiceCallback<MessageResponse>() {
                @Override
                public void onResponse(MessageResponse response) {
                    context = response.getContext();
                    textResponse = response.getText().get(0);
                    reply.setText(textResponse);
                    System.out.println(textResponse);
                    action5(textResponse); // It is real result that you want.
                }
                @Override
                public void onFailure(Exception e) {
                }
            });
            //return textResponse; // Not necessary.
        }
    }
    
    //
    private class WatsonTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(final String... textToSpeak) {
           /* runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(" ");
                }
            });*/
            TextToSpeech textToSpeech = initTextToSpeechService();
            streamPlayer = new StreamPlayer();
            streamPlayer.playStream(textToSpeech.synthesize(textToSpeak[0], Voice.EN_LISA).execute());
            return "Text to Speech Done";
        }
        /*@Override protected void onPostExecute(String result) {
            textView.setText("");
        }*/
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //Register the UI controls.
        input = (EditText) findViewById(R.id.input);
        send = (ImageButton) findViewById(R.id.send);
        textView = (TextView) findViewById(R.id.textView);
        reply = (TextView) findViewById(R.id.reply);
        play = (ImageButton) findViewById(R.id.play);
        new ConversationTask().execute("");
    
        //Button function
        send.setOnClickListener(action3);
    }
    
    
      //five actions on button click
    // Need a parameter to get String.
    //public void action5() {
    public void action5(String text) {
        // String textResponse = new String(); // Replace to parameter as "text".
        //System.out.println("Text to Speech:" + reply.getText());
        System.out.println("Text to Speech:" + text);
        //textView.setText("");
        WatsonTask task = new WatsonTask();
        //task.execute(String.valueOf(reply.getText()));
        task.execute(text); // Replace to parameter as "text".
        //new WatsonTask().execute(reply.getText().toString());
    }
    
    
    View.OnClickListener action3 = new View.OnClickListener() {
        public void onClick(View v) {
            //action here//
            new ConversationTask().execute(input.getText().toString());
            // action5(); // This invoking is not necessary at this point.
            // Try to invoke this method after you get conversation result.
        }
    };
    

    即使你改变了它也没有用,我想知道你如何实现initTextToSpeechService()方法。

    希望这会对你有所帮助。