Android使用Http访问网络
1》WebView 的使用
xml文件中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"></WebView> </LinearLayout>
Main中
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView=(WebView)findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true);//设置支持JavaScript脚本 webView.setWebViewClient(new WebViewClient());//跳转网页时仍在 webView.loadUrl("http://www.baidu.com");//传入地址 }
添加网络依赖
<uses-permission android:name="android.permission.INTERNET"/>
2》使用HttpURLConnection
xml文件
ScrollView可以使屏幕滑动查看屏幕外的内容
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:text="Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/button1" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </ScrollView> </LinearLayout>
Main文件
package com.example.networktest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity implements View.OnClickListener { TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button sendRequest=(Button)findViewById(R.id.button1); text =(TextView)findViewById(R.id.text1); sendRequest.setOnClickListener(this); } @Override public void onClick(View v){ if (v.getId()==R.id.button1){ sendRequestWithHttpURLConnection(); } } private void sendRequestWithHttpURLConnection(){ new Thread(new Runnable() {//开启一个新的子线程 @Override public void run() { HttpURLConnection connection=null; BufferedReader reader=null; try{ URL url=new URL("http://www.dangdang.com"); connection=(HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000);//发送http请求 InputStream in=connection.getInputStream();//获得返回的流 reader=new BufferedReader(new InputStreamReader(in));//读取数据 StringBuilder response=new StringBuilder(); String line; while ((line=reader.readLine())!=null){ response.append(line); } showResponse(response.toString());//将数据传入到showResponse函数 }catch (Exception e){ }finally { if(reader!=null){ try{ reader.close(); }catch (IOException e){ e.printStackTrace(); } } if (connection!=null){ connection.disconnect(); } } } }).start(); } private void showResponse(final String response){ runOnUiThread(new Runnable() {//由于子线程不准许操作UI所以使用runOnUiThread方法切换到主线程 @Override public void run() { text.setText(response); } }); } }
3》使用OkHttp
build.grade文件
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' testCompile 'junit:junit:4.12' compile 'com.squareup.okhttp3:okhttp:3.4.1'//添加Okhttp库依赖 }
Main.java
public void onClick(View v){
if (v.getId()==R.id.button1){
// sendRequestWithHttpURLConnection();
sendRequestWithOkHttp();
}
}
private void sendRequestWithOkHttp(){ new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient();//创建OkHttp实例 Request request = new Request.Builder().url("https://www.qu.la/book/101104/5290362.html").build();//创建Request实例 Response response = client.newCall(request).execute();//获取服务器返回的数据 String responseData=response.body().string();//获取具体内容 showResponse(responseData); }catch (Exception e){ } } }).start(); }
其余代码与上面的一样,执行结果也和使用HttpURLConnection一样
4》解析xml文件-pull解析方法
xml文件内容
更改Mian中的OkHttp函数中的代码
private void sendRequestWithOkHttp(){ new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient();//创建OkHttp实例 Request request = new Request.Builder().url("
").build();//创建Request实例 Response response = client.newCall(request).execute();//获取服务器返回的数据 String responseData=response.body().string();//获取具体内容 //showResponse(responseData); parseXmlwithPull(responseData);//解析xml文件所用方法 }catch (Exception e){ e.printStackTrace(); } } }).start(); }
parseXmlwithPull方法如下
private void parseXmlwithPull(String xmldata){ try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//获取实例 XmlPullParser xmlPullParser=factory.newPullParser();//得到XmlPullParser xmlPullParser.setInput(new StringReader(xmldata));//传入数据 int evenType=xmlPullParser.getEventType();//得到当前解析事件 String id="";String name="";String version=""; while (evenType!=xmlPullParser.END_DOCUMENT){//解析没有完成 String nodename=xmlPullParser.getName();//获取当前节点的名字 switch (evenType){ case XmlPullParser.START_TAG:{ if ("id".equals(nodename)){ id=xmlPullParser.nextText(); }else if ("name".equals(nodename)){ name=xmlPullParser.nextText(); }else if ("version".equals(nodename)){ version=xmlPullParser.nextText(); } break; } case XmlPullParser.END_TAG:{ if("app".equals(nodename)){ Log.d("MainActivity","id is"+id); Log.d("MainActivity","name is"+name); Log.d("MainActivity","version is"+version); } break; } default: break; } evenType=xmlPullParser.next(); } }catch (Exception e){ e.printStackTrace(); } }
结果如下:
5》解析json文件-GSON方法
json文件内容
加入依赖
compile 'com.google.code.gson:gson:2.7'
新建book类
package com.example.networktest; /** * Created by lenovo on 2019/3/15. */ public class Book { private String id; private String name; private String version; public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setVersion(String version) { this.version = version; } public String getId() { return id; } public String getName() { return name; } public String getVersion() { return version; } }
修改Mian方法
private void sendRequestWithOkHttp(){ new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient();//创建OkHttp实例 Request request = new Request.Builder().url("http://10.0.2.2:8080/jsontest/get_data.json").build();//创建Request实例 Response response = client.newCall(request).execute();//获取服务器返回的数据 String responseData=response.body().string();//获取具体内容 //showResponse(responseData); //parseXmlwithPull(responseData); parJsonWithGSON(responseData); }catch (Exception e){ e.printStackTrace(); } } }).start(); } private void parJsonWithGSON(String data){ Gson gson=new Gson(); List<Book> bookList=gson.fromJson(data,new TypeToken<List<Book>>(){}.getType()); for (Book book:bookList){ Log.d("MainActivity","id is "+book.getId()); Log.d("MainActivity","name is "+book.getName()); Log.d("MainActivity","version is "+book.getVersion()); } }
结果入下
6》Main.java代码汇总
package com.example.networktest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity implements View.OnClickListener { TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button sendRequest=(Button)findViewById(R.id.button1); text =(TextView)findViewById(R.id.text1); sendRequest.setOnClickListener(this); } @Override public void onClick(View v){ if (v.getId()==R.id.button1){ // sendRequestWithHttpURLConnection(); sendRequestWithOkHttp(); } } private void sendRequestWithHttpURLConnection(){ new Thread(new Runnable() {//开启一个新的子线程 @Override public void run() { HttpURLConnection connection=null; BufferedReader reader=null; try{ URL url=new URL("https://www.qu.la/book/101104/5290362.html"); connection=(HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000);//发送http请求 InputStream in=connection.getInputStream();//获得返回的流 reader=new BufferedReader(new InputStreamReader(in));//读取数据 StringBuilder response=new StringBuilder(); String line; while ((line=reader.readLine())!=null){ response.append(line); } showResponse(response.toString());//将数据传入到showResponse函数 }catch (Exception e){ }finally { if(reader!=null){ try{ reader.close(); }catch (IOException e){ e.printStackTrace(); } } if (connection!=null){ connection.disconnect(); } } } }).start(); } private void sendRequestWithOkHttp(){ new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient();//创建OkHttp实例 Request request = new Request.Builder().url("http://10.0.2.2:8080/jsontest/get_data.json").build();//创建Request实例 Response response = client.newCall(request).execute();//获取服务器返回的数据 String responseData=response.body().string();//获取具体内容 //showResponse(responseData); //parseXmlwithPull(responseData); parJsonWithGSON(responseData); }catch (Exception e){ e.printStackTrace(); } } }).start(); } private void parJsonWithGSON(String data){ Gson gson=new Gson(); List<Book> bookList=gson.fromJson(data,new TypeToken<List<Book>>(){}.getType()); for (Book book:bookList){ Log.d("MainActivity","id is "+book.getId()); Log.d("MainActivity","name is "+book.getName()); Log.d("MainActivity","version is "+book.getVersion()); } } private void parseXmlwithPull(String xmldata){ try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//获取实例 XmlPullParser xmlPullParser=factory.newPullParser();//得到XmlPullParser xmlPullParser.setInput(new StringReader(xmldata));//传入数据 int evenType=xmlPullParser.getEventType();//得到当前解析事件 String id="";String name="";String version=""; while (evenType!=xmlPullParser.END_DOCUMENT){//解析没有完成 String nodename=xmlPullParser.getName();//获取当前节点的名字 switch (evenType){ case XmlPullParser.START_TAG:{ if ("id".equals(nodename)){ id=xmlPullParser.nextText(); }else if ("name".equals(nodename)){ name=xmlPullParser.nextText(); }else if ("version".equals(nodename)){ version=xmlPullParser.nextText(); } break; } case XmlPullParser.END_TAG:{ if("app".equals(nodename)){ Log.d("MainActivity","id is"+id); Log.d("MainActivity","name is"+name); Log.d("MainActivity","version is"+version); } break; } default: break; } evenType=xmlPullParser.next(); } }catch (Exception e){ e.printStackTrace(); } } private void showResponse(final String response){ runOnUiThread(new Runnable() {//由于子线程不准许操作UI所以使用runOnUiThread方法切换到主线程 @Override public void run() { text.setText(response); } }); } }