以下是MainActiviy.java,有必要的注释,里面用到了handler,以及线程,workThread如何更新mainThread才能够更新的内容。

package com.wyl.httptest2;

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

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

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends ActionBarActivity {
	Button btn;
	Button btn2;
	EditText et;
	Handler myhandler = new myHandler();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn = (Button)findViewById(R.id.btnId);
		btn2 = (Button)findViewById(R.id.btnId2);
		MyOnclickListener l = new MyOnclickListener();
		et = (EditText)findViewById(R.id.editTextId);
		btn.setOnClickListener(l);//绑定监听器
		btn2.setOnClickListener(l);
	}

	class MyOnclickListener implements OnClickListener{
		@Override
		public void onClick(View v) {
			if(v.getId()==R.id.btnId){
				//原则:UI中的主线程不能够直接访问网络
				System.out.println("====线程名:"+Thread.currentThread().getName());
				getInternetThread myThread = new getInternetThread();
				myThread.start();
			}else if(v.getId()==R.id.btnId2){
				System.out.println("你点了清除按钮,");
				//如果是清除按钮,那么editText中的内容
				et.setText("");
			}
		}
	}
	/*
	 * 原理:因为Looper会自动地从队列里去取数据,然后自动调用继承了Handler对象的类的复写了的
	 * public void handleMessage(Message msg){}这个方法。
	 * 继承Handler的目的:
	 *   为了把从workThread获取的数据写入到UI中(Android中UI线程,即主线程是不能够访问网络的)
	 * @author Administrator
	 *
	 */
	class myHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			//打印出来是main线程,这样我们就可以直接把msg的值取出来了,
			System.out.println("====我是什么线程呢:"+Thread.currentThread().getName());
			//取出msg(取出msg.obj),这个绑定的obj属性才是我们真正要的值
			String fhz = (String)msg.obj;
			et.setText(fhz);
		}
	}
	/*
	 * 主线程(即前台点击事件相关的线程)不能够直接访问网络,那么就通过主线程启动
	 * getInternetThread这个新线程(肯定就是workThread了),然后通过这个workThread进行
	 * 网络的访问,并且这个线程把网络数据绑定到msg的obj属性上(只要走到这一步就行了,update
	 * 前台UI中的数据只需要交给继承了Handler的类的复写的Handler中的public void handleMessage(Message msg)
	 * 这个方法,这个方法会自动执行。)
	 * @author Administrator
	 *
	 */
	class getInternetThread extends Thread{
		String line = "我是空";
		@Override
		public void run() {

			System.out.println("线程名:"+Thread.currentThread().getName());
			//获取EditText 控件里的 uri
			String uri = et.getText().toString();
			if(!uri.contains("http://")){
				//如果网址不包含htt://的话那么就不能够正常访问网络
				Message m = myhandler.obtainMessage();
				m.obj = "仙人板板的,你的网址没有http://!!!";
				myhandler.sendMessage(m);
				return;
			}
			System.out.println("uri的值:"+uri);
			//访问网络
			//获取客户端对象
			HttpClient client = new DefaultHttpClient();
			//获取请求对象,并传入uri
			HttpGet get = new HttpGet(uri);
			//客户端发送请求对象
			try {
				HttpResponse resp = client.execute(get);
				//获取状态码,如果是200说明成功
				int code = resp.getStatusLine().getStatusCode();
				if(code == 200){
					//获得返回值
					InputStream in = resp.getEntity().getContent();
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					line = reader.readLine();
				}
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
//			et.setText(line);//设置EditText的值
			Message msg =  myhandler.obtainMessage();
			msg.obj = line;//这一步就把我们需要写到UI中的内容绑定到了msg上
			myhandler.sendMessage(msg);
		}
	}
}

  

Android访问网络(可以正常使用)的更多相关文章

  1. Android访问网络

    Android中访问网络用的是HttpClient的方式,即Apache提供的一个jar包.安卓中继承了改jar包,所以安卓adt中不需要专门import该jar,直接就可以使用. 以下是MainAc ...

  2. [转]Android访问网络,使用HttpURLConnection还是HttpClient

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12452307 最近在研究Volley框架的源码,发现它在HTTP请求的使用上比较有 ...

  3. Android访问网络,使用HttpURLConnection还是HttpClient?

    本文转自:http://blog.csdn.net/guolin_blog/article/details/12452307,感谢这位网友的分享,谢谢. 最近在研究Volley框架的源码,发现它在HT ...

  4. [转]android访问网络:java.net.ConnectException: localhost/127.0.0.1:8888 - Connection refused

    这对刚学会向tomcat模拟的本地服务器发送请求的同学非常重要! 转自:http://wing123.iteye.com/blog/1873763 描述:在做注册功能的时候,向本地服务器:127.0. ...

  5. android访问网络--okhttp

    import com.squareup.okhttp.MediaType;import com.squareup.okhttp.OkHttpClient;import com.squareup.okh ...

  6. .Net程序员安卓学习之路2:访问网络API

    做应用型的APP肯定是要和网络交互的,那么本节就来实战一把Android访问网络API,还是使用上节的DEMO: 一.准备API: 一般都采用Json作为数据交换格式,目前各种语言均能输出Json串. ...

  7. 深入学习Android有关网络连接的内容

    基于实际项目中碰到的些许问题,开始重新深入学习Android网络连接有关知识. Android的4.1.2版本的AndroidHttpClient模块setSoTimeout之后实际超时时间和设置的时 ...

  8. android 使用httpclient访问网络

    在主活动类中,调用一个线程访问网络(android4.0以上耗时的操作不能放在主线程中):       //声明两个Button对象,与一个TextView对象private TextView mTe ...

  9. Android实现网络访问

    Android实现网络访问 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 1) 熟练使用HttpURLConnection访问WebServ ...

随机推荐

  1. OC ---- 字典集合 iOS学习-----细碎知识点总结

    实例方法的创建 NSDictionary *wukong = [[NSDictionary alloc] initWithObjectsAndKeys:", @"age" ...

  2. 利用a标签解析URL

    参考资料 http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html 很多时候我们有从一个URL中提取域名,查询关键 ...

  3. maven手动安装jar到本地仓库

    比如oracle驱动ojdbc5.jar 1,安装MAVEN,并配置系统环境变量 2,将jar文件复制到d: 3,打开cmd窗口,cd到d: 4,执行命令:mvn install:install-fi ...

  4. 删除vector中的偶数元素,删除list中的奇数元素

    #include<vector> #include<list> #include<iostream> using namespace std; int main() ...

  5. bat命令学习笔记

    1.一般在开始声明 setlocal enabledelayedexpansion 设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展,使得批处理能够感知到变量的动态变化,在运行过程中给变 ...

  6. 使用Redis构建全局并发锁

    谈起Redis的用途,小伙伴们都会说使用它作为缓存,目前很多公司都用Redis作为缓存,但是使用Redis仅仅作为缓存未免太大材小用了.深究Redis的原理后你会发现它有很多用途,在很多场景下能够使用 ...

  7. Docker容器镜像瘦身的三个小窍门(转)

    [转自:http://dockone.io/article/8174] 在构建Docker容器时,我们应尽可能减小镜像的大小.使用共享层的镜像尺寸越小,其传输和部署速度越快. 不过在每个RUN语句都会 ...

  8. Centos 7 Asp.net core 使用QRCoder 报“Unable to load DLL &#39;gdiplus&#39;&quot;

    环境: Centos7 .Net core 2.0 问题: 使用QRCoder 报“Unable to load DLL 'gdiplus'" 同 https://q.cnblogs.com ...

  9. [IR] Search Server - Sphinx

    使用 Sphinx 更好地进行 MySQL 搜索 - IBM 尽管 MySQL 是一个出色的通用数据库,但是如果您的应用程序需要进行大量搜索,那么使用 Sphinx 可获得更好的性能. 尽管 Sphi ...

  10. PhotoSphereViewer 全景图

    1网站地址:http://photo-sphere-viewer.js.org/markers.html#demo 2参数中文地址:https://www.cnblogs.com/big-tree/p ...