这里主要讲的是如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android最常使用到的网络技术了。

1、WebView的用法

  Android提供的WebView控件可以帮助我们在自己的应用程序中嵌入一个浏览器,从而非常轻松的展示各种各样的网页。下面是一个简单的示例:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>
 public class MainActivity extends Activity {

     private WebView webView ;

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web_view); webView = (WebView) findViewById(R.layout.web_view) ;
//调用getSettings()方法可以去设置浏览器的属性,我们这里只是调用
//setJavaScriptEnabled(true)方法来设置WebView支持TavaScript脚本
webView.getSettings().setJavaScriptEnabled(true);
/*
* 调用setWebViewClient()时我们传入了一个WebViewClient对象
* 这样做的功能是当需要从一个网页跳转到另一个网页时,我们希望目标
* 网页仍然在当前网页上显示,而不是打开系统浏览器
*/
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.baidu.com");
}
}

2、使用HttpURLConnection访问网络

  使用HttpURLConnection访问网络的方式很简单,具体按以下步骤执行就可以了:

    1. 获取HttpURLConnection对象,一般我们只需要new一个URL对象,并传入目标网络地址,然后调用一下openConnection()方法即可

       URL url = new URL("http://www.baidu.com") ;
      HttpURLConnection con = (HttpURLConnection) url.openConnection() ;
    2. 获取HttpURLConnection对象之后,设置HTTP请求所使用的方法。常用的方法有两种:GET或POST。GET表示希望从服务器那里获取数据,POST则表示希望提交数据给服务器。
       con.setRequestMethod("GET");
    3. 接下来可以进行一些自由的设置,比如设置连接超时、读取超时的毫秒数,以及服务器希望得到的一些消息头等
       con.setConnectTimeout(8000);
      con.setReadTimeout(8000);
    4. 之后我们调用getInputStream()方法得到从服务器返回的输入流,然后从里面读取数据。注意,服务器返回给我们的HTML代码
       InputStream in = con.getInputStream() ;
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)) ;
      StringBuilder response = new StringBuilder() ;
      String line ;
      while((line = reader.readLine()) != null){
      response.append(line) ;
      }
    5. 最后,使用完之后,我们要记得关闭连接资源
       con.disconnect();

  下面的代码是在界面上设置了一个按钮和一个编辑框,通过点击按钮,手机访问“http://www.baidu.com”网页,并将返回的数据显示在文本框中。布局代码如下:

 <?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Request" /> <ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.61" >
<EditText
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textMultiLine" >
</EditText>
</ScrollView>
</LinearLayout>

  Activity代码如下:

 public class MainActivity extends Activity implements OnClickListener{

     private static final int SHOW_RESPONSE = 0 ;
private Button sendResquest ;
private EditText responseText ; private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case SHOW_RESPONSE :
String response = (String)msg.obj ;
//显示结果
responseText.setText(response);
}
}
} ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout); sendResquest = (Button) findViewById(R.id.button) ;
responseText = (EditText) findViewById(R.id.response_text) ;
sendResquest.setOnClickListener(this) ;
} @Override
public void onClick(View v) {
if(v.getId() == R.id.button){
sendRequestWithHttpURLConnection() ;
}
} private void sendRequestWithHttpURLConnection() {
//开启线程发起网络
new Thread(new Runnable(){ @Override
public void run() {
HttpURLConnection con = null ;
try {
URL url = new URL("http://www.baidu.com") ;
con = (HttpURLConnection) url.openConnection() ;
con.setRequestMethod("GET");
con.setConnectTimeout(8000);
con.setReadTimeout(8000);
InputStream in = con.getInputStream() ;
BufferedReader reader = new BufferedReader(new InputStreamReader(in)) ;
StringBuilder response = new StringBuilder() ;
String line ;
while((line = reader.readLine()) != null){
response.append(line) ;
} Message msg = new Message() ;
msg.what = SHOW_RESPONSE ;
msg.obj = response.toString() ;
handler.sendMessage(msg) ; } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(con != null){
con.disconnect();
}
}
}
}).start();
}
}

        

3、使用HttpClient

  访问网络,除了用上面的HttpURLConnection之外,我们还可以用HttpClient来访问http网页资源。HttpClient可以完成过和HttpURLConnection几乎一模一样的功能。具体用法如下:

    1. 获取HttpClient的实例,但是HttpClient是一个接口,我们通常是创建一个DefaultHttpClient对象

       HttpClient httpClient = new DefaultHttpClient() ;
    2. 接下来如果要发起一条GET请求,则我们需要创建一个HttpGet对象,并传入目标网络的地址,然后调用HttpClient的execute()方法就可以获得服务器的响应HttpResponse 对象
       HttpGet httpGet = new HttpGet("http://www.baidu.com") ;
      HttpResponse httpResponse = httpClient.execute(httpGet) ;

      如果是要发起一条POST请求,我们需要和创建一个HttpPost对象,并传入目标网络地址,然后通过一个NameValuePair集合来存放待提交的参数,并将这个参数集合传入UrlEncodedFormEntity中,然后调用HttpPost的setEntity()方法将构建好的UrlEncodedFormEntity传入,然后调用HttpClient的execute()方法就可以获得服务器的响应HttpResponse 对象

       HttpPost httpPost = new HttpPost("http://www.baidu.com") ;
      List<NameValuePair> params = new ArrayList<NameValuePair>() ;
      params.add(new BasicNameValuePair("username","admin")) ;
      params.add(new BasicNameValuePair("password","123456")) ;
      UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,"utf-8");
      httpPost.setEntity(entity);
      HttpResponse httpResponse = httpClient.execute(httpPost) ;
    3. 得到HttpResponse 对象之后,服务器所返回的信息就全部都包含在这里了。通常情况下我们都会先取出服务器返回的状态码,如果等于200就说明请求和相应都成功了,然后我们就提取HttpEntity实例,然后将这个实例转化为String即可
       if(httpResponse.getStatusLine().getStatusCode() == 200){
      //请求和相应都成功了
      HttpEntity entity = httpResponse.getEntity() ;
      String response = EntityUtils.toString(entity,"utf-8") ; Message msg = new Message() ;
      msg.what = SHOW_RESPONSE ;
      msg.obj = response.toString() ;
      handler.sendMessage(msg) ;
      }

Android基础总结(9)——网络技术的更多相关文章

  1. Android学习之基础知识十二 — 第一讲:网络技术的使用

    这一节主要讲如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android中最常用的网络技术. 一.WebView的用法 有时候我们可能会碰到比较特殊的需求,比 ...

  2. Android基础总结+SQlite数据库【申明:来源于网络】

    Android基础总结+SQlite数据库[申明:来源于网络] 基础总结篇之一:Activity生命周期:http://blog.csdn.net/liuhe688/article/details/6 ...

  3. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  4. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  5. 云计算和大数据时代网络技术揭秘(十二)自定义网络SDN

    软件定义网络——SDN SDN是网络技术热点,即软件定义网络,OpenFlow是实现SDN思想的一个框架标准, open是指公开.开放,具体为控制平面的规则由各个通信厂家自定义变为公开的技术标准, f ...

  6. 云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE

    数据中心存储演化——FCoE   数据中心三大基础:主机 网络 存储 在云计算推动下,存储基础架构在发生演变 传统存储结构DAS.SAN在发展中遇到了布线复杂.能耗增多的缺点(原生性),需要对架构做根 ...

  7. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  8. [转载] Google数据中心网络技术漫谈

    原文: http://www.sdnlab.com/12700.html?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd ...

  9. 基础的 Linux 网络命令,你值得拥有

    导读 有抱负的 Linux 系统管理员和 Linux 狂热者必须知道的.最重要的.而且基础的 Linux 网络命令合集.在 It's FOSS 我们并非每天都谈论 Linux 的"命令行方面 ...

随机推荐

  1. 详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

  2. room-views-用窗口颜色清除背景(Clear Background with Window Colour)选项

    这个选项是默认开启的,它的作用是在游戏每一帧绘制以前,都用一个颜色打底(覆盖整个游戏场景包括背景,从而实现背景清除),然后在这个基础上再画背景.场景等等. 如果关闭,则在游戏每一帧以前绘制背景(绘制背 ...

  3. HDU 3652 B-number(数位dp)

    题意:B数的定义是有字符串“13”且能被整数13整除的数,求[1,n]内的B数个数. 题解:这是数位DP,我也就是刚入门,前两天看到了非递归写法,好麻烦.所以我建议写dfs的方法,容易理解,代码还简短 ...

  4. POJ 2411 Mondriaan'sDream(状压DP)

    题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...

  5. Android_ _开发技巧总结

    ===  1   1.对于过多的控件,功能类似,数量又多的,可以用include方法.在实现应用中,可以把控件放入List集合中. private void initView() { // TODO ...

  6. LPC1768之GPIO

    在AHB总线上以便IO的高速操作,上电默认为输入高电平,支持GPDMA操作. 1只有GPIO0和GPIO2上的引脚能产生中断,/EXIT0~3特殊的外中断引脚. 2P0.29/0.30很特殊要么同为输 ...

  7. sql server 2008 评估期已过期如何升级

    1, http://wenku.baidu.com/view/49c88e2ab4daa58da0114af4.html 2, #BYTECH# ##

  8. PHP批量替换MySql数据库中的数据内容(替换MySql数据库内容源码)

    PHP批量替换MySql数据库内容 UTF-8 1.0版 <?php //声明 //1.本源码开发意图:作者在使用一些CMS建站的时候发现很多CMS把网址写入到数据库了,如果换网址,那么就需要更 ...

  9. php序列化,反序列化

    serialize("数组"); //序列化的函数 序列化示范:serialize(array('1'=>1235622,'2'=>'4142122')); unser ...

  10. ORA-30036

    http://blog.sina.com.cn/s/blog_676255e101018d5s.html