在线解析JSON+ AsyncTaskLoader
效果图:

获取并解析Json
package com.example.admin.quakereport;
import android.text.TextUtils;import android.util.Log;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;
public class QueryUtils {
private static final String LOG_TAG = QueryUtils.class.getSimpleName();
public static List<Earthquake> fetchEarthquakeData(String requestUrl){ URL url = createUrl(requestUrl); String jsonResponse = null; try { jsonResponse = makehttpRequest(url); }catch (IOException e){ Log.e(LOG_TAG,"Error in making http request",e); } List<Earthquake> result = extractEarthquakes(jsonResponse); return result; }
private static URL createUrl(String mUrl) { URL url = null; try { url = new URL(mUrl); } catch (MalformedURLException e) { Log.e(LOG_TAG, "Problem building the URL ", e); } return url; }
private static String makehttpRequest(URL url)throws IOException { String jsonResponse = ""; if (url == null) { return jsonResponse; }
HttpURLConnection urlConnection = null; InputStream inputStream = null;
try { urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setReadTimeout(10000); urlConnection.setConnectTimeout(15000); urlConnection.setRequestMethod("GET"); urlConnection.connect();
if (urlConnection.getResponseCode() == 200) { inputStream = urlConnection.getInputStream(); jsonResponse = readFromStream(inputStream); } else { Log.e(LOG_TAG, "Error in connection!! Bad Response "); }
} catch (IOException e) { Log.e(LOG_TAG, "Problem retrieving the earthquake JSON results.", e); } finally { { if (urlConnection != null) { urlConnection.disconnect(); } if (inputStream != null) { inputStream.close(); } } } return jsonResponse; }
private static String readFromStream(InputStream inputStream)throws IOException{ StringBuilder output = new StringBuilder(); if (inputStream != null) { InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8")); BufferedReader reader = new BufferedReader(inputStreamReader); String line = reader.readLine();
while (line != null) { output.append(line); line = reader.readLine(); } }
return output.toString();}
private static List<Earthquake> extractEarthquakes(String earthquakeJSON){ final String getJsonArray="features",jsObject="properties",double_magnituede="mag",String_location="place" ,String_time="time",String_url="url";
if (TextUtils.isEmpty(earthquakeJSON)) { return null; } List<Earthquake> earthquakes = new ArrayList<>();
try { JSONObject baseJsonResponse = new JSONObject(earthquakeJSON); JSONArray featureArray = baseJsonResponse.getJSONArray(getJsonArray);
for (int i = 0; i < featureArray.length(); i++) { JSONObject currentEarthquake = featureArray.getJSONObject(i); JSONObject properties = currentEarthquake.getJSONObject(jsObject); double magnitude = properties.getDouble(double_magnituede); String location = properties.getString(String_location); long time = properties.getLong(String_time); String Url = properties.getString(String_url); Earthquake earthquake = new Earthquake(magnitude, location, time,Url); earthquakes.add(earthquake); }
}catch (JSONException e){ Log.e(LOG_TAG,"Error in fetching data",e); } return earthquakes; }
}
android 网络连接必须放在子线程中,不推荐用AsyncTask的原因:横屏时AsyncTask不会被回收到内存。
package com.example.admin.quakereport;
import android.content.AsyncTaskLoader;import android.content.Context;import android.support.annotation.NonNull;import android.support.annotation.Nullable;
import java.util.List;
public class EarthquakeLoader extends AsyncTaskLoader<List<Earthquake>> { private String mUrl; private List<Earthquake> itemlist;
public EarthquakeLoader(@NonNull Context context,String mUrl) { super(context); this.mUrl=mUrl; }
@Override protected void onStartLoading() { if (itemlist!=null){ deliverResult(itemlist); }else { forceLoad(); } }
@Nullable @Override
public List<Earthquake> loadInBackground(){ if (mUrl == null) { return null; } List<Earthquake> earthquakes = QueryUtils.fetchEarthquakeData(mUrl); return earthquakes; }
@Override public void deliverResult(@Nullable List<Earthquake> data) { itemlist=data; super.deliverResult(data); }}
github项目源码: https://github.com/NeoWu55/Android-QuakeReport
在线解析JSON+ AsyncTaskLoader的更多相关文章
- QT使用QJson生成解析Json数据的方法
QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...
- JSON在线解析,新版本JSON在线解析
SOJSON,出了新版本的JSON在线解析,真的很好用,可以上下版本.左右版本.效果图如下.它的网址是:http://www.sojson.com/simple_json.html SOJSON集成了 ...
- 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址
在线聊天项目结构图: 多用户登陆效果图: 多用户聊天效果图: 数据库效果图: 重新构建了Server类,使用了Gson方法,通过解析Json字符串,增加Info类,简化判断过程. Server类代码如 ...
- JSON在线解析及格式化校验工具 jsonin.com
JSON在线解析及格式化校验工具 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.它是基 ...
- php 解析json失败,解析为空,json在线解析器可以解析,但是json_decode()解析失败(原)
$str2='{"code":200,"datas":{"id":1,"coupon_id":"123&quo ...
- WP8解析JSON格式(使用Newtonsoft.Json包)
DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式. 这里举一个简单的解析JSON格式的例子(更多JSON操作): { "response&q ...
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- ios 中使用SBJson拼接和解析json
1.ios解析json 使用开源json包,项目地址: http://stig.github.com/json-framework/ NSData * responseData = [res ...
- 使用JSONObject生成和解析json
1. json数据类型 类型 描述 Number 数字型 String 字符串型 Boolean 布尔型 Array 数组,以"[]"括起来 Object 对象,类似于C中的结构体 ...
随机推荐
- Java开发笔记(四十一)日历工具Calendar
前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年.ge ...
- java的ArrayList源码摘要
ArrayList本质上是一组对象数组,ArrayList有三种构造方法 1.指定长度创建ArrayList,2.默认长度为10创建.3,用旧的集合创建一个ArrayList. 对ArrayList的 ...
- 【设计原则和编程技巧】单一职责原则 (Single Responsibility Principle, SRP)
单一职责原则 (Single Responsibility Principle, SRP) 单一职责原则在设计模式中常被定义为“一个类应该只有一个发生变化的原因”,若我们有两个动机去改写一个方法,那这 ...
- 程序员50题(JS版本)(三)
程序11:判断101~200之间有多少个素数,并输出所有素数 for(var i=101,num=0;i<=200;i++){ for(var j=2;j<=i;j++){ if(i%j= ...
- 【代码笔记】Web-CSS-CSS 分组和嵌套
一, 效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- js 浏览器兼容css中webkit、Moz、O、ms...写法封装(es6语法)
/** *浏览器兼容写法封装 */ let elementStyle = document.createElement('div').style let vendor = (() => { le ...
- 请不要在广州.NET俱乐部群里谈郑智话题,谢谢!
收到私聊说代码无国界,但是程序员是有国界的,程序员也有关心国家大事的权力! 我是极度赞同“代码无国界,但是程序员是有国界的,”我也极度赞同程序员也要爱国. 因为我们新兴县六祖镇叶氏家族就有四位爱国 ...
- 当我们按下电源键,Android 究竟做了些什么?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由goo发表于云+社区专栏 相信我们对Android系统都不陌生,而Android系统博大精深,被各种各样的智能设备承载的同时,我们会否 ...
- Windbg学习笔记
下载winsdksetup.exe ,双击,选择Debugging Tools for Windows安装. 64位系统抓64位进程dump,用64位windbg来分析.64位系统抓32位进程dump ...
- AD域安装及必要设置
本文主要介绍AD域的安装和程序开发必要的设置. 一.安装AD域 运行dcpromo命令,安装AD域. 步骤: 1.win+R 2.dcpromo 图例: 百度百 ...