開始你的下載之旅
-
如何請求網絡數據
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然后重寫相關方法
相關方法與執行流程