网络编程数据处理_学习笔记_第七周

一、下载

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值