请求网络,Handler信息传递,流转字符串

Handler消息传递

HttpURLConnection请求访问网络

根据流返回一个字符串信息

访问网络的权限:<uses-permission android:name="android.permission.INTERNET"/>

<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/et_url"
            android:layout_width="0dip"
            android:text="http://192.168.1.254:8080/ServerItheima28/test.jsp"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:layout_weight="1" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="getHtml"
            android:text="GO" />
    </LinearLayout>

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <TextView
            android:id="@+id/tv_html"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </ScrollView>

</LinearLayout>
package com.itheima28.htmldemo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private static final String TAG = "MainActivity";
	private static final int SUCCESS = 0;
	protected static final int ERROR = 1;
	private EditText etUrl;
	private TextView tvHtml;

	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case SUCCESS:
				 tvHtml.setText((String) msg.obj);
				break;
			case ERROR:
				Toast.makeText(MainActivity.this, "访问失败", 0).show();
				break;
			default:
				break;
			}
		}

	};

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

		etUrl = (EditText) findViewById(R.id.et_url);
		tvHtml = (TextView) findViewById(R.id.tv_html);

	}

	public void getHtml(View v) {
		final String url = etUrl.getText().toString();
		//4.0之后,请求网络访问的代码都要放在一个线程中
		//这样请求出问题了也不会影响到原来的主线程
		new Thread(new Runnable() {

			@Override
			public void run() {
				// 请求网络
				String html = getHtmlFromInternet(url);

				if(!TextUtils.isEmpty(html)) {
					// 更新textview的显示了
					Message msg = new Message();
					msg.what = SUCCESS;
					msg.obj = html;
					handler.sendMessage(msg);
				} else {
					Message msg = new Message();
					msg.what = ERROR;
					handler.sendMessage(msg);
				}
			}
		}).start();
	}

	/**
	 * 根据给定的url访问网络, 抓去html代码
	 * @param url
	 * @return
	 */
	protected String getHtmlFromInternet(String url) {

		try {
			URL mURL = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) mURL.openConnection();

			conn.setRequestMethod("GET");
			conn.setConnectTimeout(10000);
			conn.setReadTimeout(5000);

//			conn.connect();

			int responseCode = conn.getResponseCode();

			if(responseCode == 200) {
				InputStream is = conn.getInputStream();
				//根据流返回一个字符串信息
				String html = getStringFromInputStream(is);
				return html;
			} else {
				Log.i(TAG, "访问失败: " + responseCode);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 根据流返回一个字符串信息
	 * @param is
	 * @return
	 * @throws IOException
	 */
	private String getStringFromInputStream(InputStream is) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;

		while((len = is.read(buffer)) != -1) {
			baos.write(buffer, 0, len);
		}
		is.close();

		String html = baos.toString();	// 把流中的数据转换成字符串, 采用的编码是: utf-8

		String charset = "utf-8";
		if(html.contains("gbk") || html.contains("gb2312")
				|| html.contains("GBK") || html.contains("GB2312")) {		// 如果包含gbk, gb2312编码, 就采用gbk编码进行对字符串编码
			charset = "gbk";
		}

		html = new String(baos.toByteArray(), charset);	// 对原有的字节数组进行使用处理后的编码名称进行编码
		baos.close();
		return html;
	}
}
时间: 2024-12-07 19:24:30

请求网络,Handler信息传递,流转字符串的相关文章

安卓开发时酷派手机不打印请求网络信息问题的解决

在做安卓开发的时候,肯定要用到调试了,但是我买的酷派大神F1居然不打印请求网络的日志,在百度上寻找了一下解决办法最终解决: 解决方案: 拨号盘输入*20121220#   ->  选择日记输出级别  ->  选择Java log level -> 选择LOGD即可 这样就能够打印日志了,这是因为机子出厂的时候做了一定的限制,重新设置一下就行了,我一开始还以为是Eclipse的版本问题呢,试了一下三星的手机,发现没问题,就只有是手机的问题了,就找到了这个解决方法!

Android 手机卫士--构建服务端json、请求网络数据

本文地址:http://www.cnblogs.com/wuyudong/p/5900384.html,转载请注明源地址. 数据的传递 客户端:发送http请求 http://www.oxx.com/index.jsp?key=value 服务器:在接受到请求以后,给客户端发送数据,(json,xml),json数据从数据库中读取出来,读取数据拼接json,语法规则,结构 获取服务器版本号(客户端发请求,服务端给响应,(json,xml)) http://www.oxxx.com/update.

【黑马Android】(06)使用HttpClient方式请求网络/网易新闻案例

使用HttpClient方式请求网络 <LinearLayout 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网络编程之传递数据给服务器(二)

Android网络编程之传递数据给服务器(二) 请尊重他人的劳动成果,转载请注明出处:Android网络编程之传递数据给服务器(二) 我曾在<Android网络编程之传递数据给服务器(一)> 一文中介绍了如何通过GET方式传递数据给服务器,通过GET方式传递数据主要适用于数据大小不超过2KB,且对安全性要求不高的情况下.下面就介绍通过POST方式传递数据主到服务器. 一.通过Post方式传递数据给服务器 通过Post方式传递数据给服务器是Android应用程序开发提交数据给服务器的一种主要的方

Android网络编程之传递数据给服务器(一)

Android网络编程之传递数据给服务器(一) 请尊重他人的劳动成果,转载请注明出处:Android网络编程之传递数据给服务器(一) 因为Android程序需要和服务器进行通信,所以需要服务器端提供的支持. 一.通过GET方式传递数据给服务器 通过GET方式上传数据主要适用于数据大小不超过2KB,且对安全性要求不高的情况下. 1.创建服务器端: 服务器端项目结构: 第一步:创建控制器Servlet package com.jph.sgm.servlet; import java.io.IOExc

Android开发请求网络方式详解

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42643401 大家知道Google支持和发布的Android移动操作系统,主要是为了使其迅速占领移动互联网的市场份额,所谓移动互联网当然也是互联网了,凡是涉及互联网的任何软件任何程序都少不了联网模块的开发,诚然Android联网开发也是我们开发中至关重要的一部分,那么Android是怎么样进行联网操作的呢?这篇博客就简单的介绍一下Android常用的联网方式,包括JDK支持的Ht

.Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

原文:.Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器 目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不多,因此在实现的过程中遇到了很多坑,在这边博客中,逐一介绍下.下面进入正文 正文: 1-启用httpClient注入: 参考文档:https://docs.microsoft.c

【我的Linux,我做主!】实战--使用netstat监控网络连接信息

目录:(一)netstat简介(二)netstat语法指南(三)实战演练(四)netstat小结 (一)netstat简介(1.1)在Internet的RFC标准中,netstat的定义是:netstat是在内核中访问网络连接状态及相关信息的程序,它能提供TCP连接.在TCP和UDP监听.进程内存管理的相关报告.netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息.netstat用于显示IP.TCP.UDP和IC

nginx log记录请求的头信息

记录访问的log,为了在出现特殊情况时,方便检查出现问题的地方.log_format accesslog ‘$remote_addr – $remote_user [$time_local] “$request” ‘‘$status $body_bytes_sent “$http_referer” ‘‘”$http_user_agent” $http_x_forwarded_for';access_log /var/log/nginx/access.log accesslog;记录下,用户ip,