聊天机器人(二)-聊天功能的实现

/ 1评 / 0

关于聊天界面的实现,在上一篇中,已经讲解的差不多了,接下来就是聊天功能的实现了,聊天功能调用了图灵机器人的接口(http://www.tuling123.com/),ps:这个机器人真的不是很智能啊,太笨了

关于接口的使用图灵机器人的官网上面已经讲得很详细了,APIKEY只需要注册一下在个人中心就可以获取到,当然我们关心的重点应该是怎么把别人提供的接口放到自己的程序中

tuling

由于在主线程(UI线程)里面不能使用耗时的操作,所以我们当点击发送按钮的时候,使用开启一个发送消息的线程来进行接口的调用,而在自己开启的线程里面不能更新UI,所以使用了handler将获取到的消息传递 给UI线程,下面是调用接口的线程的具体源码,关于APIKEY,请参考上面介绍的自行获取

/**
 * 用于连接网络的类,发送消息
 * 调用的是图灵机器人网站提供的接口
 * 具体接口使用请参考网站
 * www.tuling123.com
 * Created by Jay on 2016/1/22.
 */
public class SendMessage implements Runnable {

    public static final int RESPONES_OK = 1;
    public static final int RESPONES_ERROR = 2;

    private final String API_ANDRESS = "http://www.tuling123.com/openapi/api";
    private final String API_KEY = "***********";
    private String msg;
    private Handler handler;

    public SendMessage(Handler handler, String msg) {
        this.handler = handler;
        this.msg = msg;
    }

    @Override
    public void run() {

        String requestString = "key=" + API_KEY + "&info=" + msg;
        String responseString = "";
        try {
            URL url = new URL(API_ANDRESS);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setConnectTimeout(1000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            OutputStream outputStream = conn.getOutputStream();
            outputStream.write(requestString.getBytes("utf-8"));
            outputStream.close();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String temp;
            while ((temp = reader.readLine()) != null) {
                responseString += temp;
            }
            //将消息通过handler传递给主线程
            Bundle bundle = new Bundle();
            bundle.putString("msg", responseString);
            Message message = handler.obtainMessage(RESPONES_OK);
            message.setData(bundle);
            handler.sendMessage(message);
        } catch (MalformedURLException e) {
            handler.sendEmptyMessage(RESPONES_ERROR);
            e.printStackTrace();
        } catch (IOException e) {
            handler.sendEmptyMessage(RESPONES_ERROR);
            e.printStackTrace();
        }
    }
}

主线程里面handler的使用,将handler定义为静态的原因请自行百度,因为不是我们的重点

/**
 * 自定义handler请自行百度
 */
private static class MyHandler extends Handler {
    WeakReference<MainActivity> mActivity;

    public MyHandler(MainActivity activity) {
        mActivity = new WeakReference<MainActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        MainActivity ac = mActivity.get();
        MsgBean msgBean = new MsgBean("", R.drawable.girl1, MsgBean.TYPE_RECV);
        switch (msg.what) {
            case SendMessage.RESPONES_OK: {
                Bundle bundle = msg.getData();
                String str = bundle.getString("msg");
                Log.v("client", str);
                JSONObject jsonObject = null;
                try {
                    jsonObject = new JSONObject(str);
                    String ss = jsonObject.getString("text");
                    msgBean.setMsg(ss);
                } catch (JSONException e) {
                    msgBean.setMsg("啊偶,好像出现一些问题了!");
                    e.printStackTrace();
                }
            }
            break;
            default: {
                msgBean.setMsg("啊偶,好像出现一些问题了!");
            }
            break;
        }
        ac.showMsg(msgBean);
    }
}

好了,上面就是全部的内容了,两篇博客,只能挑点重点的来讲,还有漏掉的请大家参看源码吧,注释还是很详细的,如果有不懂的地方,欢迎大家给我留言

360网盘下载  访问密码 0b38    开发环境为Android stdio

  1. yy说道:

    源没了,能再发一份吗,谢谢

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注