日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android studio開發小型對話機器人app(實例代碼)

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

前言

偶然在網上看到一個免費機器人接口,所以生此想法,接口地址:http://api.qingyunke.com/,Android開發比爬蟲要繁瑣得多,所以本文我將細說接口的調用方法,讀者可根據思路去網上找一些免費接口拿來玩,其他代碼一帶而過,詳細源碼見文末。

成品展示:

Android studio開發小型對話機器人app(實例代碼)

開發步驟

1)新建項目empty,必要可github托管。

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

Android studio開發小型對話機器人app(實例代碼)

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

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

(3)寫接口調用首先封裝一個RobotManager類,用于接收用戶輸入之后對Url進行封裝。

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中的!!替換為用戶輸入的內容 return real_url; }}

其次在java->第一個包下創建一個接口GetConnection,用來接收接口返回的返回。

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

然后開始寫MyConnection類,調用接口,給參,并通過GetConnection接口將網上接口返回的數據傳遞出去。

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);//延時時間 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');//測試時用的,無須關心。 } }catch(IOException io) { if (getConnection != null) { getConnection.onError(io); } } } }).start(); }}

(4)寫頁面邏輯頁面邏輯主要是將從接口得到的內容渲染到頁面上。首先進行一系列初始化,綁定布局,然后監聽按鈕點擊接收用戶輸入,調用MyConnection類傳入url,輸入內容接收接口返回內容,同時用handler動態更新頁面。

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); // 當有新消息時,刷新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將返回內容序列化為ContentBean對象。 if(contentBean.getResult()==0){ data.putString('result',contentBean.getContent()); }else{ data.putString('result','我聽不懂你在說什么呀!'); } 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(); // 初始化消息數據 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); // 當有新消息時,刷新ListView中的顯示 msgRecyclerView.scrollToPosition(msgList.size() - 1); // 將ListView定位到最后一行 inputText.setText(''); // 清空輸入框中的內容 } } }); } private void initMsgs() { Msg msg1 = new Msg('我是菲菲,快來和我聊天吧* ( ´͈ ᵕ `͈ )◞♡', Msg.TYPE_RECEIVED); msgList.add(msg1); }}

由于接口返回的數據是Json格式,所以我們需要對Json進行解析,本文采用google的Gson庫對其進行解析,將接口內容序列化為一個類ContentBean。解析過程見上面代碼。

public class ContentBean { /** * result : 0 * content : [04月08日] 邯鄲天氣:小雨,白天 17℃,夜晚 9℃,微風,<3級轉3-4級 */ 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用于解析消息是發送方還是接收方并展示在消息列表上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) { // 如果是發出的消息,則顯示右邊的消息布局,將左邊的消息布局隱藏 holder.rightLayout.setVisibility(View.VISIBLE); holder.leftLayout.setVisibility(View.GONE); holder.rightMsg.setText(msg.getContent()); } } @Override public int getItemCount() { return mMsgList.size(); }}

尾聲

以上代碼可復制使用,但其中有一些圖片,類庫什么的需要自行導入,完整代碼見geithub:點擊此處直達

該項目是我早期項目,只是為了記錄當初的開發流程,所以并不存在什么設計模式,代碼結構也比較亂,注釋也比較少,如果有任何問題,歡迎添加我的QQ詢問!

總結

到此這篇關于Android studio開發一個小型對話機器人app的文章就介紹到這了,更多相關android studio 對話機器人內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
一区福利视频| 人在线成免费视频| 日韩视频二区| 群体交乱之放荡娇妻一区二区| 麻豆精品视频在线观看免费| 青青国产91久久久久久| 日本中文字幕不卡| 四虎精品一区二区免费| 欧美日韩激情| 好吊日精品视频| 野花国产精品入口| 国产精品色网| 免费人成在线不卡| 日韩中文字幕一区二区高清99| 日韩高清二区| 国产精品久久久久9999高清| 麻豆视频一区二区| 日韩中文在线电影| 欧美~级网站不卡| 亚洲欧美日韩国产| 中文字幕av一区二区三区人| 日韩av二区在线播放| 国产精品一卡| 卡一卡二国产精品| 91综合网人人| 在线日韩视频| 免费精品视频| 日韩超碰人人爽人人做人人添| 久久国产日韩欧美精品| 老色鬼精品视频在线观看播放| 成人黄色av| 国产精品av一区二区| 日韩中文字幕麻豆| 国产香蕉精品| 啪啪国产精品| 久久福利一区| 国产亚洲欧美日韩精品一区二区三区| 国精品产品一区| 岛国av在线网站| 欧美/亚洲一区| 日韩av一区二区在线影视| 国产高清亚洲| 久久视频精品| 亚洲a级精品| 久久99久久人婷婷精品综合| 亚洲不卡系列| 免费久久99精品国产| 国产精品午夜av| 99精品视频在线观看免费播放| 久久亚洲风情| 久久三级毛片| 红桃视频欧美| 国产精品xxx| 都市激情国产精品| 亚洲精品婷婷| 成人污污视频| 日韩一区精品视频| 国产va免费精品观看精品视频| 国产精品88久久久久久| 亚洲日产国产精品| 日韩毛片视频| 日韩和欧美一区二区三区| 在线精品亚洲欧美日韩国产| 蜜臀精品一区二区三区在线观看| 精品一区二区三区在线观看视频| 亚洲一区观看| 精品国产一区二区三区性色av| 99热精品在线观看| 国产欧美一区二区三区国产幕精品| 亚洲伦乱视频| 日本视频一区二区| 欧洲激情综合| 精品国产乱码久久久| 免费精品视频最新在线| 中文字幕在线看片| 日韩和欧美的一区| 欧美精品高清| 欧美+亚洲+精品+三区| 精品99在线| 蜜桃视频一区二区| 国产日韩电影| 欧美精品福利| 欧美中文日韩| 久久精品午夜| 亚洲欧洲国产精品一区| 999久久久国产精品| 久久爱www.| 日本不卡高清视频| 亚洲成人日韩| 午夜欧美巨大性欧美巨大| 日韩av不卡在线观看| 尹人成人综合网| 国产精品不卡| 久久av导航| 奇米色欧美一区二区三区| 日韩午夜电影| 久久久精品午夜少妇| 久久精品国产99国产| 在线观看亚洲精品福利片| 91精品国产福利在线观看麻豆| 美女国产精品久久久| 日韩av不卡一区二区| 视频在线观看一区| 婷婷亚洲综合| 国产一区二区中文| 日韩精品诱惑一区?区三区| 色爱av综合网| 成人欧美一区二区三区的电影| 国产精品网址| 久久国产三级| 91成人精品在线| 亚欧洲精品视频在线观看| 日本欧美在线看| 亚洲成人精品| 成人日韩在线| 国产精品精品国产一区二区| 国产精品极品在线观看| 国产日韩在线观看视频| 18国产精品| 欧美久久香蕉| 国产三级一区| 国产毛片精品| 欧美一区二区三区免费看| 青草国产精品| 欧美日韩伊人| 国产另类在线| 久久wwww| 色乱码一区二区三区网站| 精品一区av| 久久av日韩| 国产成人精品福利| 国产精品黑丝在线播放| av免费不卡国产观看| 国产超碰精品| 欧美一区二区性| 国产亚洲一区在线| 丝瓜av网站精品一区二区 | 欧美成人精品三级网站| 国产美女高潮在线| 蜜桃精品在线| 亚洲成人一区在线观看| 九九精品调教| 欧美中文一区二区| 亚洲欧洲一区| 久久亚洲风情| 日本午夜精品一区二区三区电影| 国产免费久久| 麻豆免费精品视频| 国产精品成久久久久| 欧美三级精品| 亚洲精品a级片| 亚洲日本国产| 日韩欧美激情| 国产极品久久久久久久久波多结野 | 国产精品久久久亚洲一区| 国产丝袜一区| 国内一区二区三区| 久久人人99| 水野朝阳av一区二区三区| 日韩国产在线一| 精品福利久久久| 免费不卡中文字幕在线| 免费黄网站欧美| 国产精品自拍区| 成人精品国产亚洲| 1024精品久久久久久久久| 午夜电影一区| 美女视频黄久久| 亚洲国产成人二区| 国产高清一区| 91精品国产自产精品男人的天堂| 精品无人区麻豆乱码久久久 | 日韩毛片在线| 亚洲一区二区免费在线观看| 国产精品久久777777毛茸茸| 日韩精品诱惑一区?区三区| 午夜在线视频一区二区区别| 911精品国产| 成人免费电影网址| 日韩美女国产精品| 韩国久久久久久| 亚洲自啪免费| 精品网站999| 亚洲一区二区动漫| 激情久久一区二区| 免费在线欧美视频| 精品三级国产| 国产精品日韩| 美女视频黄免费的久久| 91久久在线| 国产精品成人自拍| 亚洲高清影视| 精品国产三区在线| 久久亚洲一区| 黑人精品一区| 日韩在线黄色| 日韩av首页| 国产精品xvideos88| 国产亚洲精品v| 日韩大片免费观看|