android HttpURLConnection编程详解,获取网络图片,html代码查

本文出自:http://blog.csdn.net/zhongnan09/article/details/6565130

在Android中,使用http协议的编程工作是比较简单的,androidSDK中已经集成了Apache的HttpClient模块。使用HttpClient可以快速开发出功能强大的Http程序。不过一般说来,要开发与Internet连接的程序,最基础的还是使用HttpURLConnection。

下面是一个使用HttpURLConnection对象从互联网上读取数据的Demo:

 

第一个Demo是从互联网上读取某个图片:

 

首先在Eclipse中新建一个工程ImageView。而后新建一个Activity名称为MainActivity:

       package com.xzq.image;

 

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.Toast;

 

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    private EditText pathText;

    private ImageView imageView;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

 

       pathText = (EditText) this.findViewById(R.id.urlpath);

       imageView = (ImageView) this.findViewById(R.id.imageView);

       Button button = (Button) this.findViewById(R.id.button);

       button.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

              String path = pathText.getText().toString();

              try {

                  byte[] data = getImage(path);

                  Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,

                         data.length);

                  imageView.setImageBitmap(bitmap);

              } catch (Exception e) {

                  Toast.makeText(MainActivity.this, R.string.error, 1).show();

                  Log.e(TAG, e.toString());

              }

           }

       });

    }

 

    public static byte[] getImage(String path) throws Exception {

       URL url = new URL(path);

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       conn.setRequestMethod("GET");

       conn.setConnectTimeout(5 * 1000);

       InputStream inStream = conn.getInputStream();

       return readFromInput(inStream);

    }

 

    public static byte[] readFromInput(InputStream inStream) throws Exception {

       ByteArrayOutputStream outStream = new ByteArrayOutputStream();

       byte[] buffer = new byte[1024];

       int len = 0;

       while ((len = inStream.read(buffer)) != -1) {

           outStream.write(buffer, 0, len);

       }

       inStream.close();

       return outStream.toByteArray();

    }

}

 

布局文件:

       <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical" android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <TextView android:layout_width="fill_parent"

       android:layout_height="wrap_content" android:text="@string/urlpath" />

 

    <EditText android:layout_width="fill_parent"

       android:layout_height="wrap_content" android:text="http://www.baidu.com/img/baidu_sylogo1.gif"

       android:id="@+id/urlpath" />

 

    <Button android:layout_width="wrap_content"

       android:layout_height="wrap_content" android:text="@string/button"

       android:id="@+id/button" />

 

    <ImageView android:layout_width="wrap_content"

       android:layout_height="wrap_content" android:id="@+id/imageView" />

</LinearLayout>

 

最后一项要注意的地方是,要运行该工程,必须在AndroidManifest.xml文件中加上访问网络的权限:

    <?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.xzq.image" android:versionCode="1" android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

       <activity android:name=".MainActivity"

           android:label="@string/app_name">

           <intent-filter>

              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />

           </intent-filter>

       </activity>

 

    </application>

    <uses-sdk android:minSdkVersion="8" />

    <!-- 访问网络的权限 -->

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

 

</manifest>

结果:

 

 

 

 

 

第二个例子是一个Html代码查看器,主要为演示如何从互联网上获取网页数据:

 

同样,在Eclipse中新建一个工程,创建启动Activity,命名为MainActivity:

 

       package com.xzq.htmlcode;

 

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

 

       TextView textView = (TextView) this.findViewById(R.id.textView);

       try {

           textView.setText(getHtmlCode("http://www.sohu.com"));

       } catch (Exception e) {

           Log.e("MainActivity", e.toString());

           Toast.makeText(MainActivity.this, "网络连接失败", 1).show();

       }

 

    }

 

    public static String getHtmlCode(String path) throws Exception {

       URL url = new URL(path);

       HttpURLConnection conn = (HttpURLConnection) url.openConnection();

       conn.setRequestMethod("GET");

       conn.setConnectTimeout(5 * 1000);

       InputStream inStream = conn.getInputStream();

       byte[] data = readFromInput(inStream);

       String html = new String(data, "gbk");

       return html;

    }

 

    public static byte[] readFromInput(InputStream inStream) throws Exception {

       ByteArrayOutputStream outStream = new ByteArrayOutputStream();

       byte[] buffer = new byte[1024];

       int len = 0;

       while ((len = inStream.read(buffer)) != -1) {

           outStream.write(buffer, 0, len);

       }

       inStream.close();

       return outStream.toByteArray();

    }

}

 

布局文件:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <ScrollView

     android:layout_width="fill_parent"

     android:layout_height="fill_parent">

       <TextView 

           android:layout_width="fill_parent"

           android:layout_height="wrap_content"

           android:id="@+id/textView"

           />

    </ScrollView>

</LinearLayout>

结果如图:

 

 

要注意加上ScrollView标签,否则,当页面数据比较大时,不能出现滚动条,影响使用。另外,同样要在AndroidManifest.xml文件中添加访问网络的权限,见上例。

 

       这两个例子本身并没有实际的应用价值,只是展示了如何使用HttpURLConnection对象实现联网,并从互联网上读取图片、网页文件等数据。使用HttpURLConnection对象进行网络编程的核心过程也就是如此了。当然,HttpURLConnection对象还有很多方法,可以设置访问访问请求头字段等信息。感兴趣的朋友可以发送邮件到我的邮箱,共同探讨。

在后面的一篇文章中,我将会跟大家讨论使用post方式上传数据,包括文件等。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值