您的位置:首页 > 理论基础 > 计算机网络

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

2016-04-17 11:52 323 查看

一、网络数据的获取

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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: