http请求和消息

http请求

使用步骤:

1. 创建一个url
URL url = new URL(PathString);
2. 使用url打开一个http链接
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
3. 设置请求方法和超时时间
urlCon.setRequestMethod("GET");
urlCon.setConnectTimeout(5000);
4. 获取http链接的状态码,根据状态码做处理 状态码:200 ok,404 没有找到资源、503、509 服务器端错误
int code = conn.getResponseCode();
if(code == 200){
//第5步放在这里
}
5. 获取数据流并转换为字符串
InputStream inputStream = urlCon.getInputStream();
String webCodeString = StreamTools.readStream(inputStream);

消息

使用步骤:

1. 创建一个Handler对象,并实现它的handleMessage方法
private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			String data = (String) msg.obj;
			
			tv_content.setText(data);
		};
	};
2. 在需要发送消息的地方使用Handler对象发送一个消息,会发送到handlerMesage函数中
Message msg = Message.obtain();//从消息池中取出一个消息,效率比new消息要高
msg.obj = data;
handler.sendMessage(msg);

消息原理

 前提知识:
所有使用UI界面的操作系统,后台都运行着一个死循环,在不停的监听和接收用户发出的指令,一旦接收指令就立即执行。
当我们的Android应用程序的进程一创建的时候,系统就给这个进程提供了一个Looper,Looper是一个死循环,它内部维护这个一个消息队列,
Loop不停地从消息队列中取消息(Message),取到消息就发送给了Handler,最后Handler根据接收到的消息去修改UI。

 mainlooper---应用启动好之后 mainLooper(消息循环器) 就已经创建好了 不断监视消息队列里的消息 ,一旦发现消息队列里有消息就会把消息交给Hander处理
Handler 就会调用 handleMessage()处理 ,Handler的作用就是发送消息和处理消息    

补充

1. 非UI线程不能修改UI界面(进度条相关的UI除外,可以在非UI线程中更新进度条相关UI)
activity中的oncreate方法和单击事件的方法都是运行在主线程(创建UI)中的。
只有创建UI界面的那个线程才能修改UI: Only the original thread that created a view hierarchy can touch its views.
主线程(UI线程),只有主线程才能修改UI。如果子线程修改UI,系统验证当前线程是不是主线程,如果不是主线程,就会终止运行。
2. 网络在主线程上的异常: android.os.NetworkOnMainThreadException
从Androi4.0开始,google增加UI界面运行的流畅性,强制要求访问网络等耗时操作不能在主线程中进行,只能在子线程中进行。
3. Handler发送空消息
handler.sendEmptyMessage(1);//直接发送一个1过去,不用构造Message对象
在消息处理函数中可以用msg.what获得1

消息处理常用API

//创建一个子线程 
		new Thread(){public void run() {
			
			//1 常见消息处理api
			/*runOnUiThread( new Runnable() {
				public void run() {
					
					tv.setText("我直接更新textview了   哈哈哈哈 ");
					
				}
			});*/
			
			
		};}.start();
		
		// 2常见消息处理api  delayMillis延迟时间    几秒钟后 执行  run方法
					/*new Handler().postDelayed(new Runnable() {
						
						@Override
						public void run() {
							
							tv.setText("我直接更新textview了   哈哈哈哈 ,有本事 你来打我啊");
							
						}
					}, 5000);
		*/
					
					
		//3 常见消息处理api 
					
		new Handler().postAtTime(new Runnable() {
			
			@Override
			public void run() {
				tv.setText("我直接更新textview了   哈哈哈哈 ,有本事 你来打我啊    哈哈哈");
			}
		}, SystemClock.uptimeMillis()+5000);		
	}


示例代码:

	package com.itheima.htmlview;

	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.view.View;
	import android.widget.EditText;
	import android.widget.TextView;
	import android.widget.Toast;

	import com.itheima.htmlview.utils.StreamTools;

	public class MainActivity extends Activity {

	
	private EditText et_path;
	private TextView tv_content;
	
	
	
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			String data = (String) msg.obj;
			
			tv_content.setText(data);
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		et_path = (EditText) findViewById(R.id.et_path);

		tv_content = (TextView) findViewById(R.id.tv_content);
	}

	public void click(View view){
		
		new Thread(){
			public void run() {
				
				try {
					String path = et_path.getText().toString().trim();
	//				1、发送请求
	//			    (1)创建一个URL对象
					 URL url = new URL(path);
					 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	//				(2)设置请求头信息
					 conn.setRequestMethod("GET");
					 conn.setConnectTimeout(3000);
	//			   2、服务器返回数据
	//			    (1)判断状态码:200 ok,404 没有找到资源、503、509 服务器端错误
					 
					 int code = conn.getResponseCode();
					 if(code == 200){
	//						(2)解析服务器返回的二进制数据,解析成一个字符串
						 InputStream is = conn.getInputStream();
						String data = StreamTools.readStream(is);

	//					    (3)把string显示在TextView上
						Message msg = Message.obtain();
						msg.obj = data;
						 handler.sendMessage(msg);
					 }else{
						 Toast.makeText(MainActivity.this, "请输入一个HTML页面的网络地址", 0).show();
					 }

				} catch (Exception e) {
					e.printStackTrace();
				}
			};
		}.start();
	    
	}

	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值