Android網(wǎng)絡(luò)編程之獲取網(wǎng)絡(luò)上的Json數(shù)據(jù)實(shí)例
為要獲取網(wǎng)絡(luò)上的Json所以需要服務(wù)器端提供的支持。
一、創(chuàng)建服務(wù)器端:
服務(wù)器端項(xiàng)目結(jié)構(gòu):
服務(wù)器端運(yùn)行效果圖:
第一步:創(chuàng)建業(yè)務(wù)所需的JavaBean
package com.jph.sj.model;
import java.util.Date;
/**
* 新聞實(shí)體類(lèi)
* @author jph
* Date:2014.09.26
*/
public class News {
private Integer id;
private String title;
private Date publishDate;
public News(Integer id, String title, Date publishDate) {
this.id = id;
this.title = title;
this.publishDate = publishDate;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Date getPublishDate() {
return publishDate;
}
public void setPublishDate(Date publishDate) {
this.publishDate = publishDate;
}
}
第二步:創(chuàng)建業(yè)務(wù)邏輯接口和具體實(shí)現(xiàn)類(lèi)
業(yè)務(wù)接口:
package com.jph.sj.service;
import java.util.List;
import com.jph.sj.model.News;
public interface NewsService {
/**
* 獲取最新的資訊
* @return
*/
public List<News> getLastNews();
}
業(yè)務(wù)接口的實(shí)現(xiàn)類(lèi):
package com.jph.sj.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.jph.sj.model.News;
import com.jph.sj.service.NewsService;
public class NewsServiceBean implements NewsService {
/**
* 獲取最新的視頻資訊
* @return
*/
public List<News> getLastNews(){
List<News> newes = new ArrayList<News>();
newes.add(new News(1, "李白", new Date(System.currentTimeMillis())));
newes.add(new News(2, "杜甫", new Date(System.currentTimeMillis()+8200)));
newes.add(new News(3, "賈寶玉",new Date(System.currentTimeMillis()-6000)));
return newes;
}
}
第三步:創(chuàng)建控制器Servlet
package com.jph.sj.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jph.sj.model.News;
import com.jph.sj.service.NewsService;
import com.jph.sj.service.impl.NewsServiceBean;
/**
* 負(fù)責(zé)響應(yīng)客戶(hù)端的請(qǐng)求:http://xxx/NewsListServlet/NewsListServlet
*/
public class NewsListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private NewsService newsService = new NewsServiceBean();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<News> newes = newsService.getLastNews();//獲取最新的視頻資訊
//[{id:20,title:"xxx",timelength:90},{id:10,title:"xbx",timelength:20}]
StringBuilder sbJson = new StringBuilder();
//將list集合封裝成Json格式的字符串
sbJson.append('[');
for(News news : newes){
sbJson.append('{');
sbJson.append("id:").append(news.getId()).append(",");
sbJson.append("title:\"").append(news.getTitle()).append("\",");
sbJson.append("publishDate:").append(news.getPublishDate().getTime());
sbJson.append("},");
}
sbJson.deleteCharAt(sbJson.length() - 1);//刪除字符串末尾的逗號(hào)
sbJson.append(']');
request.setAttribute("json", sbJson.toString());
request.getRequestDispatcher("/WEB-INF/page/jsonnewslist.jsp").forward(request, response);
}
}
第四步:創(chuàng)建jsonnewslist.jsp頁(yè)面
<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>
${json}
至此服務(wù)器端項(xiàng)目已經(jīng)完成。下面開(kāi)始創(chuàng)建Android端項(xiàng)目。
二、創(chuàng)建Android端:
Android端項(xiàng)目結(jié)構(gòu):
第一步:創(chuàng)建業(yè)務(wù)所需的JavaBean
提示:因?yàn)榉?wù)器端和Android端項(xiàng)目都是用Java語(yǔ)言實(shí)現(xiàn)的,所以一些組件可以共用,JavaBean便是其中之一。此時(shí)我們?cè)诖罱ˋndroid端項(xiàng)目的時(shí)候,完全可以將服務(wù)器端項(xiàng)目中JavaBean拿來(lái)用。
第二步:創(chuàng)建Android端項(xiàng)目的業(yè)務(wù)邏輯層
核心代碼:GetAndParseJson:
package com.jph.gj.service;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.jph.model.News;
import android.os.Handler;
import android.os.Message;
/**
* 獲取并解析網(wǎng)絡(luò)上的Json
* @author jph
* Date:2014.09.26
*/
public class GetAndParseJson {
private String url="http://10.219.61.117:8080/ServerForJSON/NewsListServlet";
public static final int PARSESUCCWSS=0x2001;
private Handler handler;
public GetAndParseJson(Handler handler) {
// TODO Auto-generated constructor stub
this.handler=handler;
}
/**
* 獲取網(wǎng)絡(luò)上的XML
*/
public void getJsonFromInternet () {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
HttpURLConnection conn=(HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (conn.getResponseCode()==200) {
InputStream inputStream=conn.getInputStream();
List<News>listNews=parseJson(inputStream);
if (listNews.size()>0) {
Message msg=new Message();
msg.what=PARSESUCCWSS;//通知UI線程Json解析完成
msg.obj=listNews;//將解析出的數(shù)據(jù)傳遞給UI線程
handler.sendMessage(msg);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
/**
* 解析json格式的輸入流轉(zhuǎn)換成List
* @param inputStream
* @return List
*/
protected List<News> parseJson(InputStream inputStream) {
// TODO Auto-generated method stub
List<News>listNews=new ArrayList<News>();
byte[]jsonBytes=convertIsToByteArray(inputStream);
String json=new String(jsonBytes);
try {
JSONArray jsonArray=new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jObject=jsonArray.getJSONObject(i);
int id=jObject.getInt("id");
String title=jObject.getString("title");
long time=jObject.getLong("publishDate");
News news=new News(id, title, new Date(time));
listNews.add(news);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listNews;
}
/**
* 將輸入流轉(zhuǎn)化成ByteArray
* @param inputStream
* @return ByteArray
*/
private byte[] convertIsToByteArray(InputStream inputStream) {
// TODO Auto-generated method stub
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte buffer[]=new byte[1024];
int length=0;
try {
while ((length=inputStream.read(buffer))!=-1) {
baos.write(buffer, 0, length);
}
inputStream.close();
baos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return baos.toByteArray();
}
}
第三步:創(chuàng)建Activity
package com.jph.gj.activity;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jph.gj.R;
import com.jph.gj.service.GetAndParseJson;
import com.jph.model.News;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* 獲取網(wǎng)絡(luò)上的Json
* @author jph
* Date:2014.09.26
*/
public class MainActivity extends Activity {
private List<News>listNews;
private ListView list;
Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case GetAndParseJson.PARSESUCCWSS:
listNews=(List<News>) msg.obj;
initData();
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=(ListView)findViewById(R.id.list);
GetAndParseJson getAndParseJson=new GetAndParseJson(mHandler);
getAndParseJson.getJsonFromInternet();
}
/**
* 將解析后的xml填充到ListView
*/
protected void initData() {
// TODO Auto-generated method stub
List<Map<String, Object>>items=new ArrayList<Map<String,Object>>();
for (News news:listNews) {
Map<String, Object>item=new HashMap<String, Object>();
item.put("id", news.getId());
item.put("title", news.getTitle());
item.put("time", convertDate(news.getPublishDate()));
items.add(item);
}
SimpleAdapter adapter=new SimpleAdapter(this, items, R.layout.line, new String[]
{"id","title","time"}, new int[]{R.id.tvId,R.id.tvTitle,R.id.tvTime});
list.setAdapter(adapter);
}
private String convertDate(Date publishDate) {
// TODO Auto-generated method stub
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
return sdf.format(publishDate);
}
}
至此Android端項(xiàng)目已經(jīng)完成了。下面就讓我們看一下APP運(yùn)行效果吧:
Android運(yùn)行效果圖:
- android 網(wǎng)絡(luò)編程之網(wǎng)絡(luò)通信幾種方式實(shí)例分享
- Android中Retrofit+OkHttp進(jìn)行HTTP網(wǎng)絡(luò)編程的使用指南
- Android網(wǎng)絡(luò)編程之UDP通信模型實(shí)例
- android網(wǎng)絡(luò)編程之a(chǎn)ndroid連接網(wǎng)絡(luò)的簡(jiǎn)單示例代碼
- Android通過(guò)HttpURLConnection和HttpClient接口實(shí)現(xiàn)網(wǎng)絡(luò)編程
- Android網(wǎng)絡(luò)編程之簡(jiǎn)易新聞客戶(hù)端
- Android中實(shí)現(xiàn)TCP和UDP傳輸實(shí)例
- Android使用socket創(chuàng)建簡(jiǎn)單TCP連接的方法
- Android調(diào)用默認(rèn)瀏覽器打開(kāi)指定Url的方法實(shí)例
- Android基于TCP和URL協(xié)議的網(wǎng)絡(luò)編程示例【附demo源碼下載】
相關(guān)文章
Android 兩個(gè)ViewPager的聯(lián)動(dòng)效果的實(shí)現(xiàn)
這篇文章主要介紹了Android 兩個(gè)ViewPager的聯(lián)動(dòng)效果的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Android實(shí)現(xiàn)探探圖片滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)探探圖片滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android編程實(shí)現(xiàn)3D滑動(dòng)旋轉(zhuǎn)效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)3D滑動(dòng)旋轉(zhuǎn)效果的方法,主要通過(guò)繼承Animation自定義Rotate3D來(lái)實(shí)現(xiàn)3D翻頁(yè)效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11android開(kāi)發(fā)教程之文本框加滾動(dòng)條scrollview
EditText與TextView加上滾動(dòng)條其實(shí)很簡(jiǎn)單,只需要在文本輸入框或者文本顯示框上面加上滾動(dòng)條控件即可2014-02-02Android編程實(shí)現(xiàn)基于BitMap獲得圖片像素?cái)?shù)據(jù)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)基于BitMap獲得圖片像素?cái)?shù)據(jù)的方法,對(duì)比分析了兩種獲取圖片像素的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android Studio 升級(jí)到3.0后輸入法中文狀態(tài)下無(wú)法選詞的終極解決方案
這篇文章主要介紹了 AndroidStudio 升級(jí)到3.0后輸入法中文狀態(tài)下無(wú)法選詞的解決方案,需要的朋友可以參考下2017-11-11Android實(shí)現(xiàn)圓線按鈕進(jìn)度效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓線按鈕帶進(jìn)度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05Android中Property Animation屬性動(dòng)畫(huà)編寫(xiě)的實(shí)例教程
這篇文章主要介紹了Android中Property Animation屬性動(dòng)畫(huà)編寫(xiě)的實(shí)例教程,Property Animation對(duì)于動(dòng)畫(huà)幀的操控十分強(qiáng)大,需要的朋友可以參考下2016-04-04