文档章节

浅入浅出Android(014):HTTP GET获取文本内容

樂天
 樂天
发布于 2014/09/29 14:02
字数 780
阅读 1467
收藏 42
Android studio版本:0.8.6;虚拟机版本:4.*。

1、建立android项目MyApplication


2、修改布局文件activity_my.xml

<RelativeLayout 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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MyActivity">

    <Button
        android:id="@+id/button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取网页内容" />

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button01">
        <TextView
            android:id="@+id/textview01"
            android:text=""
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </ScrollView>

</RelativeLayout>



ScrollView用于给Textview添加滚动条。

3、添加联网权限

在AndroidManifest.xml添加<uses-permission android:name="android.permission.INTERNET" />,文件最终内容是:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.letian.myapplication" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            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>

</manifest>



4、修改MyActivity.java


package com.example.letian.myapplication;

import android.app.Activity;

import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

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


public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        final Button btn01 = (Button) this.findViewById(R.id.button01);
        final TextView tv01 = (TextView) this.findViewById(R.id.textview01);
        btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv01.setText(getUrlContent("http://www.oschina.net/"));
            }
        });
    }

    private String getUrlContent(String url) {

        HttpGet getRequest = new HttpGet(url);
        getRequest.addHeader("User-Agent", " Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0");
        try {
            HttpResponse response = new DefaultHttpClient().execute(getRequest);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                StringBuffer sb = new StringBuffer("");
                String line = ""; //存储读取的一行内容
                String NL = System.getProperty("line.separator");  //换行符
                while ((line = in.readLine()) != null) {
                    sb.append(line+NL);
                }
                in.close();
                return sb.toString();
            } else {
                return "读取失败:\n"+response.getStatusLine().getStatusCode();
            }
        } catch (Exception e) {
            return "读取失败:\n"+e.toString();
        }
    }

}



5、但是运行结果并不令人满意,出现异常

网页请求时一个阻塞的过程,如果时间过长会造成程序假死,所以产生了该异常。这个异常在较新版本的Android中才提出。


6、一个并不推荐的解决办法

该方法可能会造成程序假死,所以最好不要在app中使用该方法。

在onCreate()的适当位置添加如下内容:

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
app运行结果如下:

7、使用线程的方法来解决(推荐)

将MyActivity.java修改如下:

package com.example.letian.myapplication;

import android.app.Activity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

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


public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        final Button btn01 = (Button) this.findViewById(R.id.button01);
        final TextView tv01 = (TextView) this.findViewById(R.id.textview01);

        final Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Bundle data = msg.getData();
                tv01.setText(data.getString("value"));
            }
        };

        final Runnable runnable = new Runnable(){
            @Override
            public void run() {
                String result = getUrlContent("http://www.oschina.net/");
                Message msg = new Message();
                Bundle data = new Bundle();
                data.putString("value", result);
                msg.setData(data);
                handler.sendMessage(msg);
            }
        };

        btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(runnable).start();
            }
        });
    }



    /**
     * 获取url对应的网页内容
     * @param url
     * @return
     */
    private String getUrlContent(String url) {

        HttpGet getRequest = new HttpGet(url);
        getRequest.addHeader("User-Agent", " Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0");
        try {
            HttpResponse response = new DefaultHttpClient().execute(getRequest);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                StringBuffer sb = new StringBuffer("");
                String line = ""; //存储读取的一行内容
                String NL = System.getProperty("line.separator");  //换行符
                while ((line = in.readLine()) != null) {
                    sb.append(line+NL);
                }
                in.close();
                return sb.toString();
            } else {
                return "读取失败:\n"+response.getStatusLine().getStatusCode();
            }
        } catch (Exception e) {
            return "读取失败:\n"+e.toString();
        }
    }

}


参考:

http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception
Android编程典型实例与项目开发 吴亚峰等编


© 著作权归作者所有

共有 人打赏支持
樂天
粉丝 136
博文 674
码字总数 147858
作品 3
深圳
程序员
私信 提问
加载中

评论(4)

苦辛味
苦辛味

引用来自“苦辛味”的评论

不要把StrictMode放在这种地方误新手,这东西不是来这么用的。android的网络请求再懒也要多线程,AsyncTask一开始够用了(虽然在后期也不建议使用)

引用来自“樂天”的评论

也是,不过算是一种方法,就放上去了。我还是把“不推荐”再搞得醒目些吧
之前看人这么用过,就这么直接在设置了允许在主线程做网络请求,一做网络请求就把应用卡死了。这种用法估计是CSDN的哪个人在国外博客上看到了就直接拿来用,但是没有说明原博主的警告。StrictMode只能用来调试app,其他目的都不建议
樂天
樂天

引用来自“苦辛味”的评论

不要把StrictMode放在这种地方误新手,这东西不是来这么用的。android的网络请求再懒也要多线程,AsyncTask一开始够用了(虽然在后期也不建议使用)
也是,不过算是一种方法,就放上去了。我还是把“不推荐”再搞得醒目些吧
苦辛味
苦辛味
不要把StrictMode放在这种地方误新手,这东西不是来这么用的。android的网络请求再懒也要多线程,AsyncTask一开始够用了(虽然在后期也不建议使用)
n
newnoder
OSChina 技术周刊第三期——最最常用的 100 个 Java 类

每周技术抢先看,总有你想要的! 移动开发 【博客】浅入浅出Android(014):HTTP GET获取文本内容 【博客】[Android][Android Studio] *.jar 与 *.aar 的生成 【资讯】移动 UI 模式 —— 用...

OSC编辑部
2014/10/05
4.7K
9
浅入浅出Android(007):看看你的手机上有哪些传感器

请先参考浅入浅出Android(006):实时获取加速计Accelerometer的信息。 不多说,先上代码再配图。 1、建立android项目 2、修改布局layout/main.xml <?xml version="1.0" encoding="utf-8"?...

樂天
2014/05/11
0
0
浅入浅出Android(002):使用Button类做个按钮

1、“制作”一个按钮 首先在eclipse建立android项目,应用名设为MyButton,其他创建参数取默认值。 默认的项目运行后是一个Hello wold窗口,/res/layout/activity_main.xml默认内容如下: <R...

樂天
2014/03/15
0
0
浅入浅出 Android 安全 翻译完成!

浅入浅出 Android 安全 翻译完成! 作者:Yury Zhauniarovich 译者:飞龙 来源:Yury Zhauniarovich | Publications 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 赞助我 协议 CC BY-NC-SA ...

apachecn_飞龙
2016/12/05
0
0
浅入浅出Android(000):Hello Android

开发环境选择的是Android和ADT,Android Studio有时间了再耍一耍。 File -> New -> Android Application Project,打开对话框后在“Application Name”中输入“HelloWorld”,“Project Nam...

樂天
2013/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Win10强制更新怎么关闭 彻底禁止Windows自动更新方

Win10强制更新怎么关闭 彻底禁止Windows自动更新方法 (全文) 百事数码原创 2018-07-06 17:39电脑百事网7843 + 关注 很多Win10用户来说经常会遇到这样的烦恼,电脑系统会不时的提醒自动更新,...

阿K1225
17分钟前
0
0
不用编写程序代码,送你一个爬虫程序批量采集猫眼电影票房数据

"大数据"是一个体量特别大,数据类别特别大的数据集,并且这样的数据集无法用传统数据库工具对其内容进行抓取、管理和处理。 "大数据"首先是指数据体量(volumes)大,指代大型数据集,一般在1...

技术阿飞
32分钟前
2
0
【Flutter教程】从零构建电商应用(一)

在这个系列中,我们将学习如何使用google的移动开发框架flutter创建一个电商应用。本文是flutter框架系列教程的第一部分,将学习如何安装Flutter开发环境并创建第一个Flutter应用,并学习Flu...

笔阁
53分钟前
5
0
什么是以太坊DAO?(三)

Decentralized Autonomous Organization,简称DAO,以太坊中重要的概念。一般翻译为去中心化的自治组织。 投票支付合约的所有费用和行动需要时间,并要求用户始终保持活跃,知情和专注。另一...

geek12345
55分钟前
2
0
一个本科学生对Linux的认知

一个本科学生对Linux的认知 我是一名大三的普通一本大学的软件工程的一名学生,学校开设了一些关于系统开发的课程,纸上得来终觉浅,学校的课程课时较短,想要在56个课时之内学会一些公司需要...

linuxCool
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部