handler的使用详解+http联网
2017-08-16 11:00
302 查看
1.更新UI
StreamUtils工具来:
package zz.itcast.html;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
public class StreamUtils {
// 工具类。帮我们将流转换成字符串
public static String getStringFromStream(InputStream is){
String content = null;
// 直接将流的内容写到内存中
// 创建一个字节数组输入流 他是将字符串写在内存中,并不是一个文件上
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[1024];
while((len = is.read(buf))!=-1){
baos.write(buf, 0, len);
}
// 字符串此时已经在内存中 这里是因为baos这个对象已经将toString方法进行了复写
content = baos.toString();
// 关流 关了也行 不关也可以 原因是因为写在内存中
baos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
}
MainActivirt :
package zz.itcast.html;
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;
public class MainActivity extends Activity {
private EditText et_url;
private TextView tv_src;
// 这种写法相当于给匿名内部类这个对象 再添加一个引用
private MyHandler handler = new MyHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_url = (EditText) findViewById(R.id.et_url);
tv_src = (TextView) findViewById(R.id.tv_src);
}
public void look(View view) {
// 1。现获取url
final String path = et_url.getText().toString().trim();
new Thread() {
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 告诉服务器联网的post get
// 设置联网方式 这里用大写
conn.setRequestMethod("GET");
// 设置联网超时时长 如果超过这个时间没有连上服务器 就认为连不上了
conn.setConnectTimeout(5000);
// 拿到状态响应码 只要拿响应码 就已经开始联网
int code = conn.getResponseCode();
if (code == 200) {
// 状态码为200代表联网成功
// 拿到服务器返回的数据,输入流
InputStream is = conn.getInputStream();
// 将抽象的流转换成我们能看懂的字符串,并且显示在TextView上
String content = StreamUtils.getStringFromStream(is);
// // 显示出来
// tv_src.setText(content);
// javabean对象可以携带数据
Message msg = new Message();
// 赛点数据给msg
msg.obj = content;
// 调用这个方法把消息发送到主线程
handler.sendMessage(msg);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
//调用这个方法得到子线程发送的数据更新UI
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// 这个方法一定是在主线程调用
System.out
.println("handler的线程:" + Thread.currentThread().getName());
String content = (String) msg.obj;
// 在这可以更新UI
tv_src.setText(content);
}
}
}
2.发送延时消息
后续更新....
StreamUtils工具来:
package zz.itcast.html;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
public class StreamUtils {
// 工具类。帮我们将流转换成字符串
public static String getStringFromStream(InputStream is){
String content = null;
// 直接将流的内容写到内存中
// 创建一个字节数组输入流 他是将字符串写在内存中,并不是一个文件上
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[1024];
while((len = is.read(buf))!=-1){
baos.write(buf, 0, len);
}
// 字符串此时已经在内存中 这里是因为baos这个对象已经将toString方法进行了复写
content = baos.toString();
// 关流 关了也行 不关也可以 原因是因为写在内存中
baos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
}
MainActivirt :
package zz.itcast.html;
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;
public class MainActivity extends Activity {
private EditText et_url;
private TextView tv_src;
// 这种写法相当于给匿名内部类这个对象 再添加一个引用
private MyHandler handler = new MyHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_url = (EditText) findViewById(R.id.et_url);
tv_src = (TextView) findViewById(R.id.tv_src);
}
public void look(View view) {
// 1。现获取url
final String path = et_url.getText().toString().trim();
new Thread() {
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 告诉服务器联网的post get
// 设置联网方式 这里用大写
conn.setRequestMethod("GET");
// 设置联网超时时长 如果超过这个时间没有连上服务器 就认为连不上了
conn.setConnectTimeout(5000);
// 拿到状态响应码 只要拿响应码 就已经开始联网
int code = conn.getResponseCode();
if (code == 200) {
// 状态码为200代表联网成功
// 拿到服务器返回的数据,输入流
InputStream is = conn.getInputStream();
// 将抽象的流转换成我们能看懂的字符串,并且显示在TextView上
String content = StreamUtils.getStringFromStream(is);
// // 显示出来
// tv_src.setText(content);
// javabean对象可以携带数据
Message msg = new Message();
// 赛点数据给msg
msg.obj = content;
// 调用这个方法把消息发送到主线程
handler.sendMessage(msg);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
//调用这个方法得到子线程发送的数据更新UI
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// 这个方法一定是在主线程调用
System.out
.println("handler的线程:" + Thread.currentThread().getName());
String content = (String) msg.obj;
// 在这可以更新UI
tv_src.setText(content);
}
}
}
2.发送延时消息
后续更新....
相关文章推荐
- 使用HttpHandler实现URL重写
- 使用HttpHandler实现URL重写
- 使用HttpHandler实现URL重写
- 在自定义HttpHandler中使用Session
- 在asp.net中使用HttpHandler为网站图片添加水印
- ASP 中使用 HTTP 协议发送参数详解
- 使用HttpHandler+Cache实现站点访问量的统计
- AJAX核心对象-- XMLHttpRequest 对象使用详解 (二)
- 怎样在自定义HTTPHANDLER中使用SESSION的方法?
- 使用HttpHandler实现URL重写
- HTTP头部详解及使用Java套接字处理HTTP请求
- 使用HttpHandler实现URL重写
- 在自定义HttpHandler中使用Session
- 在 ASP.NET 中使用 HTTPHandler 实现 Front Controller
- 在自定义HttpHandler中使用Session
- Ajax-核心对象--XMLHttpRequest 对象使用详解
- 在自定义HttpHandler 中使用Session
- 使用HttpHandler实现URL重写
- MSDN: 在 ASP.NET 中使用 HTTPHandler 实现 Front Controller
- ASP 中使用 HTTP 协议发送参数详解