午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android studio開發(fā)小型對(duì)話機(jī)器人app(實(shí)例代碼)

瀏覽:84日期:2022-09-24 18:30:15

前言

偶然在網(wǎng)上看到一個(gè)免費(fèi)機(jī)器人接口,所以生此想法,接口地址:http://api.qingyunke.com/,Android開發(fā)比爬蟲要繁瑣得多,所以本文我將細(xì)說(shuō)接口的調(diào)用方法,讀者可根據(jù)思路去網(wǎng)上找一些免費(fèi)接口拿來(lái)玩,其他代碼一帶而過(guò),詳細(xì)源碼見文末。

成品展示:

Android studio開發(fā)小型對(duì)話機(jī)器人app(實(shí)例代碼)

開發(fā)步驟

1)新建項(xiàng)目empty,必要可github托管。

2)先寫頁(yè)面在res->layout目錄下新建兩個(gè)layout xml file

Android studio開發(fā)小型對(duì)話機(jī)器人app(實(shí)例代碼)

activity_main作為主頁(yè)面,msg_item為附在其上的消息頁(yè)面。(具體代碼見文末)

這里再acitvity_main采用的不是ListView而是RecyclerView。

(3)寫接口調(diào)用首先封裝一個(gè)RobotManager類,用于接收用戶輸入之后對(duì)Url進(jìn)行封裝。

public class RobotManager { private static String url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg=!!'; public static String getUrl(String question){ String real_url = url.replace('!!',question);//將url中的!!替換為用戶輸入的內(nèi)容 return real_url; }}

其次在java->第一個(gè)包下創(chuàng)建一個(gè)接口GetConnection,用來(lái)接收接口返回的返回。

public interface GetConnection { void onFinish(String response);//返回正常 void onError(Exception e);//返回錯(cuò)誤}

然后開始寫MyConnection類,調(diào)用接口,給參,并通過(guò)GetConnection接口將網(wǎng)上接口返回的數(shù)據(jù)傳遞出去。

public class MyConnection { public static void getResponse(final String url,final GetConnection getConnection){ new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection; try{ URL Url = new URL(url); connection = (HttpURLConnection) Url.openConnection(); connection.setRequestMethod('GET');//Get方法 connection.setConnectTimeout(2000);//延時(shí)時(shí)間 connection.setReadTimeout(3000); connection.setDoInput(true); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } Log.e('result',response.toString()); if (getConnection != null) { getConnection.onFinish(response.toString()); }else { Log.e('WeiNull','WeiNull');//測(cè)試時(shí)用的,無(wú)須關(guān)心。 } }catch(IOException io) { if (getConnection != null) { getConnection.onError(io); } } } }).start(); }}

(4)寫頁(yè)面邏輯頁(yè)面邏輯主要是將從接口得到的內(nèi)容渲染到頁(yè)面上。首先進(jìn)行一系列初始化,綁定布局,然后監(jiān)聽按鈕點(diǎn)擊接收用戶輸入,調(diào)用MyConnection類傳入url,輸入內(nèi)容接收接口返回內(nèi)容,同時(shí)用handler動(dòng)態(tài)更新頁(yè)面。

public class MainActivity extends AppCompatActivity { private List<Msg> msgList = new ArrayList<Msg>(); private EditText inputText; private Button send; private RecyclerView msgRecyclerView; private MsgAdapter adapter; private Handler handler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { switch (msg.what){ case 1:{ Bundle data = msg.getData(); String result = data.getString('result'); Msg robotMsg = new Msg(result,Msg.TYPE_RECEIVED); msgList.add(robotMsg); adapter.notifyItemInserted(msgList.size() - 1); // 當(dāng)有新消息時(shí),刷新ListView中的顯示 msgRecyclerView.scrollToPosition(msgList.size() - 1); // 將ListView定位到最后一行 }break; case 2:{}break; default:break; } } }; private void getInter(String content){ MyConnection.getResponse(RobotManager.getUrl(content), new GetConnection() { @Override public void onFinish(String response) { ContentBean contentBean = new ContentBean(); Log.e('getResult',response); Message msg = new Message(); Bundle data = new Bundle(); Gson gson = new Gson(); contentBean = gson.fromJson(response,ContentBean.class);//用Gson將返回內(nèi)容序列化為ContentBean對(duì)象。 if(contentBean.getResult()==0){ data.putString('result',contentBean.getContent()); }else{ data.putString('result','我聽不懂你在說(shuō)什么呀!'); } msg.setData(data); msg.what = 1; handler.sendMessage(msg); } @Override public void onError(Exception e) { e.printStackTrace(); } }); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMsgs(); // 初始化消息數(shù)據(jù) inputText = findViewById(R.id.input_text); send = findViewById(R.id.send); msgRecyclerView = findViewById(R.id.msg_recycler_view); LinearLayoutManager layoutManager = new LinearLayoutManager(this); msgRecyclerView.setLayoutManager(layoutManager); adapter = new MsgAdapter(msgList); msgRecyclerView.setAdapter(adapter); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String content = inputText.getText().toString(); if (!''.equals(content)) { Msg msg = new Msg(content, Msg.TYPE_SENT); msgList.add(msg); getInter(content); Log.e('url',RobotManager.getUrl(content)); adapter.notifyItemInserted(msgList.size() - 1); // 當(dāng)有新消息時(shí),刷新ListView中的顯示 msgRecyclerView.scrollToPosition(msgList.size() - 1); // 將ListView定位到最后一行 inputText.setText(''); // 清空輸入框中的內(nèi)容 } } }); } private void initMsgs() { Msg msg1 = new Msg('我是菲菲,快來(lái)和我聊天吧* ( ´͈ ᵕ `͈ )◞♡', Msg.TYPE_RECEIVED); msgList.add(msg1); }}

由于接口返回的數(shù)據(jù)是Json格式,所以我們需要對(duì)Json進(jìn)行解析,本文采用google的Gson庫(kù)對(duì)其進(jìn)行解析,將接口內(nèi)容序列化為一個(gè)類ContentBean。解析過(guò)程見上面代碼。

public class ContentBean { /** * result : 0 * content : [04月08日] 邯鄲天氣:小雨,白天 17℃,夜晚 9℃,微風(fēng),<3級(jí)轉(zhuǎn)3-4級(jí) */ private int result; private String content; public int getResult() { return result; } public void setResult(int result) { this.result = result; } public String getContent() { return content; } public void setContent(String content) { this.content = content; }}

(5)其余代碼Msg和MsgAdapter用于解析消息是發(fā)送方還是接收方并展示在消息列表上Msg

public class Msg { public static final int TYPE_RECEIVED = 0; public static final int TYPE_SENT = 1; private String content; private int type; public Msg(String content, int type) { this.content = content; this.type = type; } public String getContent() { return content; } public int getType() { return type; }}

MsgAdapter

public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> { private List<Msg> mMsgList; static class ViewHolder extends RecyclerView.ViewHolder { LinearLayout leftLayout; LinearLayout rightLayout; TextView leftMsg; TextView rightMsg; public ViewHolder(View view) { super(view); leftLayout = (LinearLayout) view.findViewById(R.id.left_layout); rightLayout = (LinearLayout) view.findViewById(R.id.right_layout); leftMsg = (TextView) view.findViewById(R.id.left_msg); rightMsg = (TextView) view.findViewById(R.id.right_msg); } } public MsgAdapter(List<Msg> msgList) { mMsgList = msgList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Msg msg = mMsgList.get(position); if (msg.getType() == Msg.TYPE_RECEIVED) { // 如果是收到的消息,則顯示左邊的消息布局,將右邊的消息布局隱藏 holder.leftLayout.setVisibility(View.VISIBLE); holder.rightLayout.setVisibility(View.GONE); holder.leftMsg.setText(msg.getContent()); } else if(msg.getType() == Msg.TYPE_SENT) { // 如果是發(fā)出的消息,則顯示右邊的消息布局,將左邊的消息布局隱藏 holder.rightLayout.setVisibility(View.VISIBLE); holder.leftLayout.setVisibility(View.GONE); holder.rightMsg.setText(msg.getContent()); } } @Override public int getItemCount() { return mMsgList.size(); }}

尾聲

以上代碼可復(fù)制使用,但其中有一些圖片,類庫(kù)什么的需要自行導(dǎo)入,完整代碼見geithub:點(diǎn)擊此處直達(dá)

該項(xiàng)目是我早期項(xiàng)目,只是為了記錄當(dāng)初的開發(fā)流程,所以并不存在什么設(shè)計(jì)模式,代碼結(jié)構(gòu)也比較亂,注釋也比較少,如果有任何問(wèn)題,歡迎添加我的QQ詢問(wèn)!

總結(jié)

到此這篇關(guān)于Android studio開發(fā)一個(gè)小型對(duì)話機(jī)器人app的文章就介紹到這了,更多相關(guān)android studio 對(duì)話機(jī)器人內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 成人高清在线 | 亚色视频在线观看 | 中文字幕专区 | 久久视频99| 亚洲天堂精品在线观看 | 在线看国产 | 日韩欧美中文字幕在线播放 | 伊人精品在线视频 | 四虎在线免费观看 | 亚洲天堂精品在线 | 欧美精品日韩少妇 | 亚洲精品字幕在线观看 | 人人干在线 | 久久黄视频 | 超碰成人网 | 超碰96| 中文字幕――色哟哟 | 国产黄色一区 | www.国产一区 | 骚虎影院在线观看 | 色综合久久久久久 | 男人深夜网站 | 在线免费观看黄网站 | 日本久久久久 | 亚洲在线看片 | 在线免费观看亚洲 | 91尤物国产福利在线观看 | 色婷婷在线影院 | 国产极品网站 | 亚洲一区二区三区免费在线观看 | 久久精品成人一区二区三区蜜臀 | 一级毛毛片 | 337p粉嫩大胆色噜噜噜 | 中文字幕www | 免费一级片 | 色呦呦一区 | 亚洲图片在线播放 | 手机看片日韩在线 | 久久一二三四区 | 一级日韩一级欧美 | 中国黄色大片 |