开始你的下载之旅
-
如何请求网络数据
try { URL url = new URL(urlString);//通过字符串生成相应的URL HttpURLConnection connection = (HttpURLConnection) url.openConnection();//打开网址 connection.setConnectTimeout(30000);//设置打开网址的上限值(30秒) connection.setRequestMethod("GET"); //设置网址的请求模式为GET即只获取数据 // GET POST connection.connect(); //网络连接 int responseCode = connection.getResponseCode();//得到连接响应代码 String responseMessage = connection.getResponseMessage();//得到连接响应信息 String result = null; // if(responseCode == HttpURLConnection.HTTP_OK){ InputStream inputStream = connection.getInputStream();//创建一个输入流 Reader reader = new InputStreamReader(inputStream, "UTF-8"); //创建读取字符流 char[] buffer = new char[1024]; reader.read(buffer); result = new String(buffer); } else { } } catch (MalformedURLException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();}return null;
需要注意哪些点
涉及IO操作需要通过Handle或者新建AsyncTask类来调用如何下载电影、音乐、游戏(本质)?
下载的二进制的数据
请求结果如何处理
- 怎样解析XML
SAX解析
public class SAXParseHandler extends DefaultHandler {
public static final String ITEM = "item";
List<WebURL> mWebURLs;
WebURL mWebURL;
int type = 1;
boolean mIsItem;
class WebURL {
private int mID;
private String mUrl;
private String mContent;
public int getID() {
return mID;
}
public void setID(int ID) {
mID = ID;
}
public String getUrl() {
return mUrl;
}
public void setUrl(String url) {
mUrl = url;
}
public String getContent() {
return mContent;
}
public void setContent(String content) {
mContent = content;
}}
@Override
public void startDocument() throws SAXException {
super.startDocument();
mWebURLs = new ArrayList<>();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
mWebURL = new WebURL();
if(TextUtils.equals(localName, ITEM)){
for (int i = 0; i < attributes.getLength(); i++) {
if(TextUtils.equals(attributes.getLocalName(i), "id")){
mWebURL.setID(Integer.valueOf(attributes.getValue(i)));
}
}
mIsItem = true;
}
mIsItem = false;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if(TextUtils.equals(localName, ITEM)){
mWebURLs.add(mWebURL);
} }
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String content = String.valueOf(ch,start,length);
if(mIsItem){
mWebURL.setContent(content);
mIsItem = false;
} }
public List<WebURL> getXMLList() {
return mWebURLs;
}}
在其他地方使用
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
SAXParseHandler saxParseHandler = new SAXParseHandler();
xmlReader.setContentHandler(saxParseHandler);
InputStream inputStream = getResources().openRawResource(R.raw.test);
InputSource inputSource = new InputSource(inputStream);xmlReader.parse(inputSource);saxParseHandler.getXMLList();
// 简单写法
XMLReader xmlReaderTest = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
xmlReaderTest.setContentHandler(new SAXParseHandler());
// 处理xml文件的xml文件
xmlReaderTest.parse(new InputSource(getResources().openRawResource(R.raw.test)));
PULL 解析
XmlResourceParser xmlResourceParser = getResources().getXml(R.xml.test);
try {
while (xmlResourceParser.getEventType() != XmlResourceParser.END_DOCUMENT){
if(xmlResourceParser.getEventType() == XmlResourceParser.START_TAG){
String tagName = xmlResourceParser.getName();
if(TextUtils.equals(tagName, "item")){
String id = xmlResourceParser.getAttributeValue(0);
}
}
}
} catch (XmlPullParserException e) {
e.printStackTrace();} - 常用的数据格式json
InputStream is = getResources().openRawResource(R.raw.json);
String jsonString = getStringByInputStream(is);
try {
JSONObject jsonObject = new JSONObject(jsonString);
String title = jsonObject.getString("title");
JSONObject userJSONObject = jsonObject.getJSONObject("user");//获取名为“user"的JSONObject---即为{}下的数据
userJSONObject.getLong("id");//获取Json对象下的key为”id"的Long值
JSONArray jsonArray = jsonObject.getJSONArray("images");//[]里的数据
} catch (JSONException e)
{ e.printStackTrace();
} - 方便的GSON等开源库
Gson gson = new Gson();
UserData userData = gson.fromJson(jsonString,UserData.class);//JSON生成的实体类
如何导入这些库呢?
File-Project Structure-app-Dependencies-点击“+”-Library dependency下即可搜索你想导入的开源库
拓展
- 常用网络开源库
android-async-http
volley - 完善
封装请求及通用设置
封装结果处理
网络状态
- 网络状态处理
private static final String DEBUG_TAG = "NetworkStatusExample";
...
//j检查各种网络是否连接
public void connectivitytest(){
//ConnectivityManager回答关于网络连接的查询结果,并在网络连接改变时通知应用程序
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// NetworkInfo描述一个给定类型(就例而言是移动网络或 Wi-Fi)的网络接口状态。
NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
boolean isWifiConn = networkInfo.isConnected();
networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isMobileConn = networkInfo.isConnected();
Log.d(DEBUG_TAG, "Wifi connected: " + isWifiConn);
Log.d(DEBUG_TAG, "Mobile connected: " + isMobileConn);
}
//检查网络是否可用
public boolean isOnline() {
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//getActiveNetworkInfo()可以找到的第一个已连接的网络接口,如果返回 null,则表示没有已连接的网络接口(意味着网络连接不可用):
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
}
需要在AndroidMainfest.xml中加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 拦截请求设置及代理
Fiddler(Windows)
Charles(Mac)
WiFi设置代理
内容的补充---AnsyncTask异步任务
1)为什么要用AsyncTask?
程序员都是比较喜欢偷懒的,既然官方给我 们提供了AsyncTask这个封装好的轻量级异步类,为什么不用呢?我们通过几十行的代码就可以完成 我们的异步操作,而且进度可控;相比起Handler,AsyncTask显得更加简单,快捷~当然,这只适合 简单的异步操作,另外,实际异步用的最多的地方就是网络操作,图片加载,数据传输等,AsyncTask 暂时可以满足初学者的需求,谢谢小应用,但是到了公司真正做项目以后,我们更多的使用第三发的 框架,比如Volley,OkHttp,android-async-http,XUtils等很多,但是掌握AsyncTask还是很有必要的!
2)AsyncTask的基本结构:
AsyncTask是一个抽象类,一般我们都会定义一个类继承AsyncTask然后重写相关方法
相关方法与执行流程