Android面试题:网络访问
1. Android中如何访问网络
Android提供了org.apache.http.HttpClientConnection和java.net.HttpURLConnection两个连接网络对象。使用哪个都行,具体要看企业领导的要求了。 除此之外一般我比较喜欢使用xUtils中的HttpUtils功能,该模块底层使用的就是org.apache.http.client.HttpClient,使用起来非常方便。
2. 如何解析服务器传来的JSON文件
在Android中内置了JSON的解析API,在org.json包中包含了如下几个类:JSONArray、JSONObject、JSONStringer、JSONTokener和一个异常类JSONException。
JSON解析步骤
- 读取网络文件数据并转为一个json字符串
InputStream in = conn.getInputStream();
String jsonStr = DataUtil.Stream2String(in);//将流转换成字符串的工具类
将字符串传入相应的JSON构造函数中
通过构造函数将json字符串转换成json对象
JSONObject jsonObject = new JSONObject(jsonStr);
- 通过构造函数将json字符串转换成json数组:
JSONArray array = new JSONArray(jsonStr);
解析出JSON中的数据信息:
从json对象中获取你所需要的键所对应的值
JSONObject json=jsonObject.getJSONObject("weatherinfo");
Stringcity = json.getString("city");
Stringtemp = json.getString("temp")
- 遍历JSON数组,获取数组中每一个json对象,同时可以获取json对象中键对应的值
for(int i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
Stringtitle=obj.getString("title");
Stringdescription=obj.getString("description");
}
3. 生成JSON对象和数组
生成JSON
方法1、创建一个map,通过构造方法将map转换成json对象
Map<String,Object> map = new HashMap<String, Object>();
map.put("name","zhangsan");
map.put("age",24);
JSONObjectjson = new JSONObject(map);
方法2、创建一个json对象,通过put方法添加数据
JSONObjectjson=new JSONObject();
json.put("name","zhangsan");
json.put("age",24);
生成JSON数组
创建一个list,通过构造方法将list转换成json对象
Map<String,Object> map1 = new HashMap<String, Object>();
map1.put("name","zhangsan");
map1.put("age",24);
Map<String,Object> map2 = new HashMap<String, Object>();
map2.put("name","lisi");
map2.put("age",25);
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
list.add(map1);
list.add(map2);
JSONArrayarray=new JSONArray(list);
System.out.println(array.toString());
4. 如何解析服务器传来的XML格式数据
Android为我们提供了原生的XML解析和生成支持。
XML解析
- 获取解析器: Xml.newPullParser()
- 设置输入流: setInput()
- 获取当前事件类型: getEventType()
- 解析下一个事件, 获取类型: next()
- 获取标签名: getName()
- 获取属性值: getAttributeValue()
- 获取下一个文本: nextText()
- 获取当前文本: getText()
5种事件类型: START_DOCUMENT, END_DOCUMENT, START_TAG,END_TAG, TEXT
示例代码:
public List<Person>getPersons(InuptStream in){
XmlPullParserparser=Xml.newPullParser();//获取解析器
parser.setInput(in,"utf-8");
for(inttype=){ //循环解析
}
}
XML生成
- 获取生成工具: Xml.newSerializer()
- 设置输出流: setOutput()
- 开始文档: startDocument()
- 结束文档: endDocument()
- 开始标签: startTag()
- 结束标签: endTag()
- 属性: attribute()
- 文本: text()
示例代码:
XmlSerializer serial=Xml.newSerializer();//获取xml序列化工具
serial.setOuput(put,"utf-8");
serial.startDocument("utf-8",true);
serial.startTag(null,"persons");
for(Person p:persons){
serial.startTag(null,"persons");
serial.attribute(null,"id",p.getId().toString());
serial.startTag(null,"name");
serial.attribute(null,"name",p.getName().toString());
serial.endTag(null,"name");
serial.startTag(null,"age");
serial.attribute(null,"age",p.getAge().toString());
serial.endTag(null,"age");
serial.endTag(null,"persons");
}
5. 如何从网络上加载一个图片显示到界面
可以通过BitmapFactory.decodeStream(inputStream);方法将图片转换为bitmap,然后通过imageView.setImageBitmap(bitmap);将该图片设置到ImageView中。这是原生的方法,还可以使用第三方开源的工具来实现,比如使用SmartImageView作为ImageView控件,然后直接设置一个url地址即可。也可以使用xUtils中的BitmapUtils工具。
6. 如何播放网络视频
除了使用Android提供的MediaPlayer和VideoView外通常还可以使用第三方开源万能播放器,VitamioPlayer。该播放器兼容性好,支持几乎所有主流视频格式。