[android] 获取网页中的HTML数据
16lz
2021-01-24
若想使自己的android运用联网,必须要在AndroidManifest.xml中获取联网的权限,(即在里面添加 <uses-permission android:name="android.permission.INTERNET" />代码)
如下图所示:
然后就是写页面的代码了,(即:本文中的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;@Overrideprotected 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() {@Overridepublic 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 */@Overrideprotected 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,显示结果 */@Overrideprotected void onPostExecute(StringBuffer result) {// 判断是否为null,若不为null,则在页面显示HTML代码if (result != null) {edtHTTP.setText(result);}super.onPostExecute(result);}}
源码地址如下:
[android] 获取网页中的HTML数据
更多相关文章
- android 4.2 compile on 64 bits Ubuntu
- 【转】Android上HDMI介绍(基于高通平台)
- Android(安卓)建立AIDL的步骤
- Android中sqlite之从网上获取数据更新UI
- Android两种数据库操作方式介绍
- 浅谈Android辅助功能 AccessibilityService
- Android(安卓)关于休眠的几个坑点
- Android(安卓)-SharedPreferences
- Android中数据库的一些操作(增删改查)