您的位置:首页 > 移动开发 > Android开发

初学android-简单的图灵机器人

2016-07-27 17:06 375 查看
一.图灵机器人的编写需要用到的知识以及工具(1)本次程序编写用到的是android studio(2)要完成图灵机器人最基本的操作就是获得机器人对于你所发的消息进行返回的消息,首先要获取图灵机器人的api接口,这部分内容可以在http://www.tuling123.com/上面注册一个账号,然后登陆,点击之以下界面,其中的apikey是你即将要记得的东西,对于api的操作可以参考文档(基本的原理是:通过访问一个网页http://www.tuling123.com/+apikey&info="你所输入的信息" 例如:http://www.tuling123.com/http://www.tuling123.com/openapi/api?key=44ae440524f4daf68195953f180add0d&info=%E4%BD%A0%E5%A5%BD,就可以得到一串简单的json数据);(3)如果你通过访问上面的网址看到了一串json数据,那么接下来必不可少的肯定要解析这串数据,所以要用到json数据的解析;(4)其他的就是listview,adapter的运用以及数据的封装等等。二.图灵机器人的编写思路(主要通过几个类来呈现)1.数据:首先处理一系列的数据(1)httpdata类
//下面3个参数:1.表示传入的值是String 2.表示进度为空 3.表示返回的值为String
public class HttpData extends AsyncTask<String,Void,String>
{
private String website;
private HttpURLConnection connection;
private InputStream in;
private BufferedReader reader;
private HttpCallbackListener listener;
public HttpData(String website,HttpCallbackListener listener)
{
this.website=website;
this.listener=listener;
}
@Override
protected String doInBackground(String... params) {
try
{
URL
4000
url = new URL(website);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
in = connection.getInputStream();
StringBuffer sb = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line=reader.readLine())!=null)
{
sb.append(line);
}
return sb.toString();
}
catch (Exception e)
{
e.printStackTrace();
}

return null;
}
//下面的String s是返回的结果
@Override
protected void onPostExecute(String s)
{
listener.getData(s);
super.onPostExecute(s);
}
}
 大体思路:通过调用这个类中的函数,来返回一段json数据(即访问网址得到的字符串) 细节:此类继承了AsyncTask抽象类(这个类是android中封装的很好的异步消息处理机制,及在子线程中可以很方便的切换到UI线程),在这里需要重写两个方法
doInBackground和onPostExcute,第一个方法是子线程所做的操作都在这里完成,在这里我们可以
进行访问服务器(输入网址得到json数据)的操作(这个操作需要用到httpURLConnection),数据
返回到第二个方法中的参数当中,在第二个方法中我们注意到getData这个方法,这个方法是
HttpCallbackListener listener这个接口中的方法,即需要实现这个方法,那么这个方法其实就
是用来解析json数据的(其实我一开始的做法是没有用到AsyncTask,而是直接通过在子线程中获取
数据后返回,但是这样怎么也不行,即返回的数据老是空,这部分还是没有明白)。
(2)ListData类
public class ListData {private String content;private int flag;public final static int SEND=0;public final static int RECEIVE=1;private String time;public ListData(String content,int flag,String time){this.content=content;this.flag=flag;this.time=time;}public String getContent(){return content;}public int getFlag(){return flag;}public String getTime(){return time;}}
这个类是很重要的类,但是很简单,这个就是前面说的数据封装,我们一起来看这个类当中就只有content,flag两个
重要的属性,content是聊天时双方所发送的内容,既然是双方,那么肯定要有个标志位flag;其中的time属性是代表
时间(简单的说一下,这个属性是用来表示当双方聊天时间间隔超过n秒时需要在频幕上显示当前的时间的);那么这
个类其实只是封装了一条信息,即只能表示发送或者接受的一条基本信息,我们需要一个更大的盒子来承载,(就像
数组承载了其他基本类型一样,我们需要某个东西来承载类,那么我们自然而然就想到了List<E>),所以所有的数据
都被统一封装到lists当中,这样程序实现所有需要的数据都已经准备好
2.界面:主要部分是ListView
(1)这里聊天只涉及到一个界面,因此只需要一个活动
public class MainActivity extends Activity implements HttpCallbackListener{private String website;private HttpData httpData;private HttpCallbackListener hp;private String returnData;private String changeCode;private List<ListData> lists;private ListView lv;private EditText et;private Button bt;private TextAdapter adapter;private String welcomeArray[];private double currentTime,oldTime=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();bt=(Button) findViewById(R.id.button);bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String s=et.getText().toString();ChangeCode(s);ListData listData=new ListData(s,ListData.SEND,getTime());lists.add(listData);adapter.notifyDataSetChanged();website="http://www.tuling123.com/openapi/api?key=44ae440524f4daf68195953f180add0d&info="+changeCode;Log.e("haha",website);httpData= (HttpData) new HttpData(website,MainActivity.this).execute();et.setText("");}});// Log.e("haha",returnData);}private String getTime(){currentTime=System.currentTimeMillis();String currentDate;SimpleDateFormat format=new SimpleDateFormat("yyyy年mm月dd日 HH:mm:ss");Date date=new Date();currentDate=format.format(date);if(currentTime-oldTime>=60*1000){oldTime=currentTime;return currentDate;}else{return "";}}private String getWelcomeTips(){String welcomeTip;welcomeArray=this.getResources().getStringArray(R.array.welcome_tips);int index= (int) (Math.random()*(welcomeArray.length-1));//Toast.makeText(this,index,Toast.LENGTH_SHORT).show();welcomeTip=welcomeArray[index];return welcomeTip;}private void ChangeCode(String testCode){// String testCode="你好";try {changeCode = URLEncoder.encode(testCode, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}private void initView(){lists=new ArrayList<ListData>();lv=(ListView) findViewById(R.id.lv);et=(EditText) findViewById(R.id.editText);adapter=new TextAdapter(lists,this);lv.setAdapter(adapter);ListData listData=new ListData(getWelcomeTips(),ListData.RECEIVE,getTime());lists.add(listData);}@Overridepublic void getData(String s){parseText(s);}private void parseText(String s){try{JSONObject jsonObject = new JSONObject(s);ListData listData=new ListData(jsonObject.getString("text"),ListData.RECEIVE,getTime());lists.add(listData);adapter.notifyDataSetChanged();}catch (Exception e){e.printStackTrace();}}}
(2)界面主要采用ListView以及下部的输入框和提交按钮,而在此我们需要显示的最基本的有人物和机器人的头像(ImageView)和双方所说的话
(TextView)以及一些附加的显示时间。上面说的是ListView的每一条基本元素需要包括这些。
(3)那么我们自然而然想到用adapter来进行界面与数据的适配,这里我用的是BaseAdapter,这部分代码不需要过多解
释。
(4)其中一些欢迎语(对应的函数是getWelcomeTips)等等都是一些比较简单的代码。
三.最后
(1)说说我写这篇博客的感受,感觉自己思路还不是很清晰,很多东西我不能用专业化
的语句写出来,还有就是感觉上面的代码贴的很丑(毕竟标准理科生,毫无审美),
所以后面的代码我没有贴出来,我觉得还是发个百度云盘链接比较好
链接:http://pan.baidu.com/s/1nvQxTpR 密码:9yjb
(2)说说我写这个程序的感受,写这个程序给我最大的启发就是数据的封装以及接口的
灵活使用,然后还有就是listview用法的进一步熟悉还有等等。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: