一、下载
1、如何请求网络数据
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mShow_textView;
private Button mButton;
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
setListeners();
}
private void setListeners() {
mButton.setOnClickListener(this);
}
private void findViews() {
mEditText = (EditText) findViewById(R.id.editText);
mButton = (Button) findViewById(R.id.getData_button);
mShow_textView = (TextView) findViewById(R.id.show_textView);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.getData_button:
//获取URL
String urlString = getEditTextUrl();
//请求网络数据
String data = requestData(urlString);
mShow_textView.setText(data);
break;
}
}
private String getEditTextUrl() {
return mEditText !=null ? mEditText.getText().toString(): "";
}
private String requestData(String urlString) {
try {
URL url = new URL(urlString);
try {
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setRequestMethod("GET");
httpURLConnection.connect();
int responseCode = httpURLConnection.getResponseCode();
InputStream inputStream = httpURLConnection.getInputStream();
Reader reader = new InputStreamReader(inputStream,"UTF-8");
char[] buffer = new char[1024];
reader.read(buffer);
String content = new String(buffer);
return content;
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
Toast.makeText(this,"非法的url",Toast.LENGTH_SHORT).show();
}
return null;
}
}
运行时报如下错误:
原因时:在主线程里进行网络请求了,应该用异步请求。
写一个内部类继承AsyncTask类,异步请求数据:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mShow_textView;
private Button mButton;
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
setListeners();
}
private void setListeners() {
mButton.setOnClickListener(this);
}
private void findViews() {
mEditText = (EditText) findViewById(R.id.editText);
mButton = (Button) findViewById(R.id.getData_button);
mShow_textView = (TextView) findViewById(R.id.show_textView);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.getData_button:
//获取URL
String url = getEditTextUrl();
//请求网络数据
// String data = requestData(url);
new RequestNetworkDataTask().execute(url);
break;
}
}
private String getEditTextUrl() {
return mEditText !=null ? mEditText.getText().toString(): "";
}
private String requestData(String urlString) {
try {
URL url = new URL(urlString);
try {
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setRequestMethod("GET");
httpURLConnection.connect();
int responseCode = httpURLConnection.getResponseCode();
InputStream inputStream = httpURLConnection.getInputStream();
Reader reader = new InputStreamReader(inputStream,"UTF-8");
char[] buffer = new char[1024];
reader.read(buffer);
String content = new String(buffer);
return content;
} catch (IOException e) {
e.printStackTrace();
//Toast.makeText(this,"读写错误",Toast.LENGTH_SHORT).show();
}
} catch (MalformedURLException e) {
e.printStackTrace();
//Toast.makeText(this,"非法的url",Toast.LENGTH_SHORT).show();
}
return null;
}
//异步任务处理
class RequestNetworkDataTask extends AsyncTask<String,Integer,String>{
//在后台处理之前
@Override
protected void onPreExecute() {
super.onPreExecute();
//在主线程中
}
@Override
protected String doInBackground(String[] params) {
String result = requestData(params[0]);
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//执行完任务后在主线程中
mShow_textView.setText(result);
}
}
}
运行结果:
2、需要注意哪些点?
1、网络权限; —— uses-permission
2、异步请求; —— AsyncTask类
3、异步请求中不要有UI操作(要注释掉上述requestData方法里的Toast语句)
3、如何下载电影、音乐、游戏(本质都是网络请求,将流用对应的格式写进来)
4、断点下载:下载时会记录上一次下载时间等数据。
二、请求结果如何处理
1、怎样解析xml
三种解析方式:SAX、PULL、DOM。
2、常用的数据格式json
JSONObject、JSONArray
3、方便的GSON等开源库
json数据解析
raw目录下放json.txt。
在android系统里提供了json解析方案 — JSONObject类、JSONArray类等。
JSONObject类:json数据每一个大括号是一个对象,对象里是属性(键值对形式)。
JSONArray类:json数据每一个中括号是一个数组。
jsonlint.com — 格式化json数据的网站。
如何解析json数据 — 用系统的方法解析json数据
package com.example.chenjinhua.netconnect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//读取json数据
InputStream is = getResources().openRawResource(R.raw.json);
//把一个流转换成String
String jsonString = getStringByInputStream(is);
try {
//把String类型转换成JSONObject类型
JSONObject jsonObject = new JSONObject(jsonString);
//调用”get+类型“方法获取jsonObject里的user对象、id属性、array数组等。
JSONObject userJSONObject = jsonObject.getJSONObject("user");
//获取user对象里的Content属性值。
userJSONObject.getString("content");
jsonObject.getInt("id");
jsonObject.getString("title");
//jsonArray还可根据索引获取数组内容
JSONArray jsonArray = jsonObject.getJSONArray("image");
jsonArray.get(0);
} catch (JSONException e) {
e.printStackTrace();
}
}
private String getStringByInputStream(InputStream is) {
return null;
}
}
用系统方法解析json太繁琐,可以用GSON、fastjson等开源库。
通过GSON学习,学习如何引入开源库、如何拉开源库的代码、如何引用maven库。
如何引入开源库:Project structure — app — dependencies — 点击+ — 选择library dependency — 搜索框搜索开源库名的关键字 — 点击ok。
这时gson会加到app — build.gradle的compile里,然后会自动去编译,会自动从gson的maven库子找gson的库,并拉到本地。
如何使用gson开源库?
MainActivity类
Gson gson = new Gson();
//把jsonString转换成UserInfo对象 --- 把对象和json关联起来。
UserInfo userInfo = gson.fromJson(jsonString,UserInfo.class);
UserInfo类
package com.example.chenjinhua.netconnect;
import com.google.gson.annotations.SerializedName;
import java.util.List;
/**
* Created by chenjinhua on 16/4/17.
*/
public class UserInfo {
/* @SerializedName("title") 会自动将mTitle匹配json里的title。 */
@SerializedName("title")
private String mTitle;
@SerializedName("content")
private String mContent;
@SerializedName("user")
private User mUser;
/*user是内部类*/
public class User{
@SerializedName("id")
private int mID;
@SerializedName("name")
private String mName;
}
/*获取数组,数组是一个List*/
@SerializedName("mImages")
private List<String> mImages;
public String getTitle() {
return mTitle;
}
public void setTitle(String title) {
mTitle = title;
}
public String getContent() {
return mContent;
}
public void setContent(String content) {
mContent = content;
}
public User getUser() {
return mUser;
}
public void setUser(User user) {
mUser = user;
}
public List<String> getImages() {
return mImages;
}
public void setImages(List<String> images) {
mImages = images;
}
}