[android] 获取网页中的HTML数据


若想使自己的android运用联网,必须要在AndroidManifest.xml中获取联网的权限,(即在里面添加    <uses-permission android:name="android.permission.INTERNET" />代码)

如下图所示:

[android] 获取网页中的HTML数据_第1张图片


然后就是写页面的代码了,(即:本文中的activity_main.xml文件)

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="5dp" >

        <EditText
            android:id="@+id/edturl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="输入网站"
            android:inputType="textUri"
            android:singleLine="true" />

        <Button
            android:id="@+id/requesthtml"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获取html代码" />

        <EditText
            android:id="@+id/edthttp"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="这里显示的是你所输入的网站的HTML代码" />
    </LinearLayout>

</ScrollView>


重点来了,那是java文件的代码,不过,在这说一下注意的东西:在android 2.3版本以上,不能直接在主线程上联网,否则会抛出 android.os.NetworkOnMainThreadException的错误,这是因为在联网的过程中,程序会发送请求以便获取数据,但假如直接在主线程发送请求的话,页面就会卡住,进入假死状态。android后来版本为了预防这种情况,于是。。。。


因此,我们联网需要异步来操作。因为我之前都是用Thread的,现在想换换其它东西,就用了AsyncTask。


于是Java文件分为两部分,第一部分是控制页面效果和监听的,第二部分是用来执行异步操作。


第一部分代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

	// 定义组件
	private EditText edtURL;
	private EditText edtHTTP;
	private Button btnRequest;

	private String strURL;// 用于存储网站地址

	private MyTask myTask;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 初始化组件
		edtURL = (EditText) findViewById(R.id.edturl);
		edtHTTP = (EditText) findViewById(R.id.edthttp);
		btnRequest = (Button) findViewById(R.id.requesthtml);

		// 监听获取html代码的按钮
		btnRequest.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				if (!(strURL = edtURL.getText().toString()).equals("")) {
					//实例myTask对象
					myTask = new MyTask(edtHTTP);
					myTask.execute(strURL);
				}

			}
		});
	}

}

第二部分代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.xiaoyan.httpclienttest.R.integer;

import android.os.AsyncTask;
import android.widget.EditText;

/**
 * 用于异步操作来读取网页中HTML代码
 * 
 * @author jianyan
 * 
 */
public class MyTask extends AsyncTask<String, integer, StringBuffer> {

	private EditText edtHTTP;// 用于显示HTML代码
	private StringBuffer sbHTML;// 用于储存HTML代码

	public MyTask(EditText edtHTTP) {

		this.edtHTTP = edtHTTP;
		sbHTML = new StringBuffer();
	}

	/**
	 * doInBackground方法内部执行后台任务,不可在此方法内修改UI
	 */
	@Override
	protected StringBuffer doInBackground(String... params) {
		// 初始化HTTP的客户端
		HttpClient hc = new DefaultHttpClient();
		// 实例化HttpGet对象
		HttpGet hg = new HttpGet(params[0]);

		try {
			// 让HTTP客户端已Get的方式请求数据,并把所得的数据赋值给HttpResponse的对象
			HttpResponse hr = hc.execute(hg);
			// 使用缓存的方式读取所返回的数据
			BufferedReader br = new BufferedReader(new InputStreamReader(hr
					.getEntity().getContent()));

			// 读取网页所返回的HTML代码
			String line = "";
			sbHTML = new StringBuffer();
			while ((line = br.readLine()) != null) {
				sbHTML.append(line);
			}

			return sbHTML;
		} catch (IOException e) {

			edtHTTP.setText("获取网页HTML代码出错!!!");
		}
		return null;
	}

	/**
	 * onPostExecute方法用于在执行完后台任务后更新UI,显示结果
	 */
	@Override
	protected void onPostExecute(StringBuffer result) {
		// 判断是否为null,若不为null,则在页面显示HTML代码
		if (result != null) {
			edtHTTP.setText(result);
		}
		super.onPostExecute(result);
	}
}



所有代码都在上面了,然后我们看看运行的效果:(测试机:中兴U808)

[android] 获取网页中的HTML数据_第2张图片


源码地址如下:

[android] 获取网页中的HTML数据


你可能感兴趣的:(html,android,异步,网络编程,AsyncTask)