《老罗Android》学习之JSON数据解析(二)
来源:互联网 发布:p2p网络理财产品排行 编辑:程序博客网 时间:2024/05/17 19:59
1. Android客户端访问服务器的JSON数据
4. 期间,遇到一个问题:执行到 HTTPUtils中的 getResponseCode(); 取得返回码时,就地崩溃。
找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
服务器端实现:把一个对象生成Json字符串; 客户端实现:将Json字符串还原成原先的对象.
1. 建立Android工程。
2. 新建包,添加JsonActivity.java,实现访问功能。
public class JsonActivity extends Activity implements OnClickListener{private Button person, persons, liststring, listmap;private static final String TAG = "Main"; @SuppressLint("NewApi")@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_json); person = (Button) this.findViewById(R.id.person);persons = (Button) this.findViewById(R.id.persons);liststring = (Button) this.findViewById(R.id.liststring);listmap = (Button) this.findViewById(R.id.listmap);person.setOnClickListener( this);persons.setOnClickListener(this);liststring.setOnClickListener(this);listmap.setOnClickListener(this);StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.json, menu); return true; }@Overridepublic void onClick(View v) {switch (v.getId()) {//检测点击的是哪个按键case R.id.person:String path = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=person";String jsonString = HttpUtils.getJsonContent(path);Log.i(TAG, jsonString);Person person = JsonTools.getPerson("person", jsonString);Log.i(TAG, person.toString());break;case R.id.persons:String path2 = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=persons";String jsonString2 = HttpUtils.getJsonContent(path2);List<Person> list2 = JsonTools.getPersons("persons", jsonString2);Log.i(TAG, list2.toString());break;case R.id.liststring:String path3 = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=liststring";String jsonString3 = HttpUtils.getJsonContent(path3);List<String> list3 = JsonTools.getList("liststring", jsonString3);Log.i(TAG, list3.toString());break;case R.id.listmap:String path4 = "http://192.168.0.221:8080/jsonProject/JsonServlet?action_flag=listmap";String jsonString4 = HttpUtils.getJsonContent(path4);List<Map<String, Object>> list4 = JsonTools.listKeyMaps("listmap",jsonString4);Log.i(TAG, list4.toString());break;}}}3. 客户端要实现服务器端对应的类:person.java,JsonTools.java,HttpUtils.java.实现对应的解析功能。Person.java:主要是构造函数改一下,其它不变。
public Person(int id, String name, String address) {super();this.id = id;this.name = name;this.address = address;}HttpUtils.java:从服务器取得Json数据,并转换成String.
public class HttpUtils {public HttpUtils() {}public static String getJsonContent(String url_path) {try {URL url = new URL(url_path);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(3000);connection.setRequestMethod("GET");connection.setDoInput(true);int code = connection.getResponseCode();if (code == 200) {return changeInputStream(connection.getInputStream());}} catch (Exception e) {}return "";}private static String changeInputStream(InputStream inputStream) {// TODO Auto-generated method stubString jsonString = "";ByteArrayOutputStream outputStream = new ByteArrayOutputStream();int len = 0;byte[] data = new byte[1024];try {while ((len = inputStream.read(data)) != -1) {outputStream.write(data, 0, len);}jsonString = new String(outputStream.toByteArray());} catch (IOException e) {e.printStackTrace();}return jsonString;}}JsonTools.java:解析JSON
public class JsonTools {public JsonTools() {}public static Person getPerson(String key, String jsonString) {Person person = new Person();try {JSONObject jsonObject = new JSONObject(jsonString);//{"person":{"address":"beijing","id":1001,"name":"jack"}}JSONObject personObject = jsonObject.getJSONObject("person");//取出这个key,后面再当成一个JSOn:{"address":"beijing","id":1001,"name":"jack"}person.setId(personObject.getInt("id"));person.setName(personObject.getString("name"));person.setAddress(personObject.getString("address"));} catch (Exception e) {// TODO: handle exception}return person;} //{"persons":[{"address":"guangxi","id":1001,"name":"jack"},{"address":"guangdong","id":1002,"name":"rose"}]} public static List<Person> getPersons(String key, String jsonString) {List<Person> list = new ArrayList<Person>();try {JSONObject jsonObject = new JSONObject(jsonString);// ����json������JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Person person = new Person();person.setId(jsonObject2.getInt("id"));person.setName(jsonObject2.getString("name"));person.setAddress(jsonObject2.getString("address"));list.add(person);}} catch (Exception e) {}return list;} //{"liststring":["beijing","shanghai","hunan"]} public static List<String> getList(String key, String jsonString) {List<String> list = new ArrayList<String>();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {String msg = jsonArray.getString(i);list.add(msg);}} catch (Exception e) {}return list;} //{"listmap":[{"id":1001,"address":"beijing","name":"jack"},{"id":1002,"address":"shanghai","name":"rose"}]} public static List<Map<String, Object>> listKeyMaps(String key,String jsonString) {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Map<String, Object> map = new HashMap<String, Object>();Iterator<String> iterator = jsonObject2.keys();while (iterator.hasNext()) {String json_key = iterator.next();Object json_value = jsonObject2.get(json_key);if (json_value == null) {json_value = "";}map.put(json_key, json_value);}list.add(map);}} catch (Exception e) {}return list;}}在手机端点击按钮,就会打印出相应的Log信息,把JSON数据解析 出来。
4. 期间,遇到一个问题:执行到 HTTPUtils中的 getResponseCode(); 取得返回码时,就地崩溃。
找出问题点了,在MainActivity中调用这个类的网络操作方法,可能会导致activity的一些问题,谷歌从在android2.3版本以后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。
StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。
如果一定要这样操作的话,需要在MainActivity中加入如下代码:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());并且在配置文件中将SDK的最低等级设为11。
0 0
- 《老罗Android》学习之JSON数据解析(二)
- 《老罗Android》学习之JSON数据解析(一)
- 《老罗Android》学习之xml解析
- Android学习之JSON数据解析
- 《老罗Android》学习之数据存储
- 《老罗Android》学习之HTTP (二) POST和GET提交数据
- 《老罗Android》学习之HTTP (二) POST和GET提交数据
- android学习二十三(解析json格式数据)
- android学习二十三(解析json格式数据)
- Android开发之解析JSon数据(二)
- Android开发之JSON数据解析详解(二)
- 老罗Android开发视频教程( android解析json数据 )4集集合
- Android之解析Json数据
- Android之json数据解析
- Android之json数据解析
- Android之解析Json数据 .
- Android之解析json数据
- Android之json数据解析
- JS操作Json数据
- Ubuntu init启动流程分析
- android设备无法挂载(offline)解决方法
- 最最常用的端口号
- Android 中关于 【Cursor】 类的介绍
- 《老罗Android》学习之JSON数据解析(二)
- 串并口硬盘
- 既然不回头,何必再多想?
- 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是:
- hive udf函数替换特殊字符
- android 常用adb 和 adb shell 命令
- sed简明教程
- The Face Recognition Algorithm That Finally Outperforms Humans
- 黑马程序员-OC——类和对象