本文共 8477 字,大约阅读时间需要 28 分钟。
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{ //在后台处理之前 @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等开源库
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 ListmImages; 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 getImages() { return mImages; } public void setImages(List images) { mImages = images; }}