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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cqupt2011214692/article/details/51172539

一、网络数据的获取

1、权限获取

<uses-permission android:name="android.permission.INTERNET"/>

2、数据处理

public void onClick(View v) {
        switch(v.getId()){
            case R.id.button_submit:
                String url = getEditTextUrl();
                //请求网络数据
                //1.申请网络权限
//                String data = requestData(url);
                new RequestNetworkDataTask().execute(url);
                break;
        }
    }

    private String requestData(String urlString) {
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5000);
            connection.setRequestMethod("GET");

            connection.connect();
            int responseCode = connection.getResponseCode();
            String responseMessage = connection.getResponseMessage();
            InputStream inputStream = connection.getInputStream();
            Reader reader = new InputStreamReader(inputStream,"utf-8");
            char[] buffer = new char[1024];
            reader.read(buffer);
            String result = new String(buffer);

            return result;


        } catch (MalformedURLException e) {
            e.printStackTrace();
            Toast.makeText(NetWorkActivity.this,"非法的url",Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(NetWorkActivity.this,"读写异常",Toast.LENGTH_SHORT).show();
        }
        return null;
    }

3、异步处理

 //异步任务处理
    class RequestNetworkDataTask extends AsyncTask<String,Integer,String>{

        //在后台work之前
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //主线程
            //UI loading
        }

        @Override
        protected String doInBackground(String[] params) {
            //
            String result = requestData(params[0]);
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            //执行完了之后在主线程中
            mTextview.setText(result);
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }
    }

4、总结
要执行网络操作,必须获取网络权限;在获取之后就可以通过HttpUrlConnection类获取网络的数据,最后需要在线程中对数据进行异步处理,不要在主线程中处理,这样会导致程序崩溃。

二、Xml文件的解析

1.SAX的解析方式

private void testSAXParse(){
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
        SAXParser saxParser = saxParserFactory.newSAXParser();//解析器
        XMLReader xmlReader = saxParser.getXMLReader();//XML读取器
        SAXParseHandler saxParseHandler = new SAXParseHandler();
        xmlReader.setContentHandler(saxParseHandler);

        InputStream inputStream = getResources().openRawResource(R.raw.test);
        InputSource inputSource = new InputSource(inputStream);
        xmlReader.parse(inputSource);
        saxParseHandler.getXMLList();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.pull的解析方式,以城市数据进行解析

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.create);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取src文件下的资源文件
                InputStream is = getClassLoader().getResourceAsStream("weatherInfo.xml");
                //拿到pull解析器
                XmlPullParser xp = Xml.newPullParser();
                //初始化
                try {
                    xp.setInput(is,"gbk");
                    //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
                    int type = xp.getEventType();
                    City city = null;
                    while(type != XmlPullParser.END_DOCUMENT){
                        //根据节点的类型,要做不同的操作
                        switch (type){
                            case XmlPullParser.START_TAG:
                                //获取当前节点的名字
                                if("weather".equals(xp.getName())){
                                    //创建City集合对象 ,用于存放city的javabean
                                    mCityList = new ArrayList<City>();
                                }
                                else if("city".equals(xp.getName())) {
                                    //创建城市的javabean对象
                                    city = new City();
                                }
                                else if("name".equals(xp.getName())){
                                    //获取当前节点的下一个节点文本
                                    String name = xp.nextText();
                                    city.setName(name);
                                }
                                else if("temp".equals(xp.getName())){
                                    //获取当前节点的下一个节点文本
                                    String temp = xp.nextText();
                                    city.setTemp(temp);
                                }
                                else if("pm".equals(xp.getName())){
                                    //获取当前节点的下一个节点文本
                                    String pm = xp.nextText();
                                    city.setPm(pm);
                                }
                                break;
                            case XmlPullParser.END_TAG:
                                if("city".equals(xp.getName())){
                                    mCityList.add(city);
                                }
                                break;
                        }

                        //把指针移动到下一个节点,并返回该节点的事件类型
                        type = xp.next();

                    }
                    for (City c:mCityList
                            ) {
                        System.out.println(c.toString());
                    }
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

三、json数据的解析

1、类型

  • JSONObject
  • JSONArray
  • JSONException
  • JSONStringer
  • JSONTokener

2、标识
- { }表示一个对象
- [ ]表示一个数据

3、基本操作

  //JSON
  InputStream is = getResources().openRawResource(R.raw.json);
  String jsonString = getStringByInputStream(is);
  JSONObject jsonObject = new JSONObject(jsonString);
  jsonObject.get("title");
  jsonObject.getJSONArray("images");

4、利用Gson库解析
(1)导入库
app—>Dependencies—->+—–>Libray dependency—–>搜索gson
(2)创建GSON对象

 //GSON
 Gson gson = new Gson();

四、基本的网络操作

不多说,直接上代码:

public class NetWorkUtil {

    public void testNetWork(Context context){
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        boolean isWifiConnection = networkInfo.isConnected();
        networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        boolean isMobileConnection = networkInfo.isConnected();


    }
    public boolean isOnline(Context context){
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return  (networkInfo != null && networkInfo.isConnected());
    }
}

猜你喜欢

转载自blog.csdn.net/cqupt2011214692/article/details/51172539
今日推荐