文档章节

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

樂天
 樂天
发布于 2014/09/29 14:02
字数 780
阅读 1464
收藏 42
点赞 0
评论 4
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编程典型实例与项目开发 吴亚峰等编


© 著作权归作者所有

共有 人打赏支持
樂天
粉丝 133
博文 669
码字总数 147271
作品 3
深圳
程序员
加载中

评论(4)

苦辛味
苦辛味

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

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

引用来自“樂天”的评论

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

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

不要把StrictMode放在这种地方误新手,这东西不是来这么用的。android的网络请求再懒也要多线程,AsyncTask一开始够用了(虽然在后期也不建议使用)
也是,不过算是一种方法,就放上去了。我还是把“不推荐”再搞得醒目些吧
苦辛味
苦辛味
不要把StrictMode放在这种地方误新手,这东西不是来这么用的。android的网络请求再懒也要多线程,AsyncTask一开始够用了(虽然在后期也不建议使用)
n
newnoder
浅入浅出 Android 安全 翻译完成!

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

apachecn_飞龙 ⋅ 2016/12/05 ⋅ 0

浅入浅出 Android 安全:第六章 Android 安全的其它话题

第六章 Android 安全的其它话题 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们会涉及到与 Android 安全相关的其他主题,这些主题不直接属于已经...

apachecn_飞龙 ⋅ 2016/12/02 ⋅ 0

浅入浅出 Android 安全:第一章 Android

第一章 Android 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系...

apachecn_飞龙 ⋅ 2016/11/27 ⋅ 0

浅入浅出 Android 安全:第五章 Android 应用层安全

第五章 Android 应用层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 虽然在这一节中我们描述了应用层的安全性,但是实际的安全实施通常出现在到目前为止...

apachecn_飞龙 ⋅ 2016/12/02 ⋅ 0

浅入浅出Android(002):使用Button类做个按钮

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

樂天 ⋅ 2014/03/15 ⋅ 0

浅入浅出 Android 安全:第四章 Android 框架层安全

第四章 Android 框架层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 如我们在第1.2节中所描述的那样,应用程序框架级别上的安全性由 IPC 引用监视器实现...

apachecn_飞龙 ⋅ 2016/12/05 ⋅ 0

浅入浅出Android(000):Hello Android

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

樂天 ⋅ 2013/12/22 ⋅ 0

浅入浅出 Android 安全:第三章 Android 本地用户空间层安全

第三章 Android 本地用户空间层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 本地用户空间层在 Android 操作系统的安全配置中起到重要作用。 不理解在该...

apachecn_飞龙 ⋅ 2016/12/02 ⋅ 0

浅入浅出Android(007):看看你的手机上有哪些传感器

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

樂天 ⋅ 2014/05/11 ⋅ 0

31 天,从浅到深轻松学习 Kotlin

这篇文章介绍开发者用 31 天学习 Kotlin 的心得,深入浅出地介绍了 Kotlin 的一些基本特性以及高级用法,对处于不同阶段的 Kotlin 开发者来说,在提高开发效率和了解 Kotlin 提供一些参考,希...

Android_开发者 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 53分钟前 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部