当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

12.2 DrySister看妹子应用(第一版)——2.解析后台数据

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:28:17

1.一些BB上节我们把简单的项目搭起来了,然后把仓库托管到Github上了,经过分析,我们觉得有必要把下面两点优化下:1.URL写死 -> 解析接口返回的Json,处理获取图片URL2.优化图片加载,添加本地加载本节就来完成上述的第一点!2.开始写代码1)在Develop上开辟功能分支:parse_json2)抠脚Json解析接口数据数据来源接口:Gank.io API数据来源接口:Gank.io API这里我们用的是接口是:http://gank.io/api/data/福利/{请求个数}/{第几页}例如:每页显示10个,第一页:http://gank.io/api/data/福利/10/1先看下服务器返回的Json格式:PS:格式化Json的是Chrome的插件:JSON_handle根据这个我们先来编写我们的Bean类:Sister.java:/** * 描述:妹子业务Bean * * @author coder-pig: 2016/08/06 17:16 */public class Sister { private String _id; private String createAt; private String desc; private String publishedAt; private String source; private String type; private String url; private boolean used; private String who; // 一些get和set方法... }接下来我们编写一个用来解析网络数据的类,这个类里要做的事依次是:Step 1:通过HttpUrlConnection发起Get请求,然后获得后台返回的数据,此时是流形式的Step 2:我们需要写一个流转成字节数组的方法Step 3:将字节数组转成字符串后,得到的就是后台的给我们返回的数据了,接着要做的就是写一个解析这一大串Json的方法了,我们需要获取Json里我们需要的数据,丢到Bean里Step 4:返回处理后的集合数据于是乎我们编写一个网络请求的处理类:SisterApi.java:/** * 描述:网络请求处理相关类 * * @author coder-pig: 2016/08/07 14:28 */public class SisterApi { private static final String TAG = "Network"; private static final String BASE_URL = "http://gank.io/api/data/福利/"; /** * 查询妹子信息 */ public ArrayList<Sister> fetchSister(int count, int page) { String fetchUrl = BASE_URL + count + "/" + page; ArrayList<Sister> sisters = new ArrayList<>(); try { URL url = new URL(fetchUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); int code = conn.getResponseCode(); Log.v(TAG, "Server response:" + code); if (code == 200) { InputStream in = conn.getInputStream(); byte[] data = readFromStream(in); String result = new String(data, "UTF-8"); sisters = parseSister(result); } else { Log.e(TAG,"请求失败:" + code); } } catch (Exception e) { e.printStackTrace(); } return sisters; } /** * 解析返回Json数据的方法 */ public ArrayList<Sister> parseSister(String content) throws Exception { ArrayList<Sister> sisters = new ArrayList<>(); JSONObject object = new JSONObject(content); JSONArray array = object.getJSONArray("results"); for (int i = 0; i < array.length(); i++) { JSONObject results = (JSONObject) array.get(i); Sister sister = new Sister(); sister.set_id(results.getString("_id")); sister.setCreateAt(results.getString("createdAt")); sister.setDesc(results.getString("desc")); sister.setPublishedAt(results.getString("publishedAt")); sister.setSource(results.getString("source")); sister.setType(results.getString("type")); sister.setUrl(results.getString("url")); sister.setUsed(results.getBoolean("used")); sister.setWho(results.getString("who")); sisters.add(sister); } return sisters; } /** * 读取流中数据的方法 */ public byte[] readFromStream(InputStream inputStream) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len ; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } inputStream.close(); return outputStream.toByteArray(); }}好的,接着我们就去调用这个网络请求类了,我们把调用写在MainActivity.java里而Android是不允许在主线程做网络操作的这里我们就不直接new Runnable,直接写一个AsyncTask,在里面进网络操作,还有一些简单的逻辑。public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button showBtn; private Button refreshBtn; private ImageView showImg; private ArrayList<Sister> data; private int curPos = 0; //当前显示的是哪一张 private int page = 1; //当前页数 private PictureLoader loader; private SisterApi sisterApi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sisterApi = new SisterApi(); loader = new PictureLoader(); initData(); initUI(); } private void initData() { data = new ArrayList<>(); new SisterTask(page).execute(); } private void initUI() { showBtn = (Button) findViewById(R.id.btn_show); refreshBtn = (Button) findViewById(R.id.btn_ref

[1] [2]  下一页


12.2 DrySister看妹子应用(第一版)——2.解析后台数据