简单网络的应用:httpURLconnection笔记
1.Android 更新UI的两种方法——handler和runOnUiThread()
在使用网络的访问过程中,经常需要UI组件的更新,更新UI是要主线程来更新的,即UI线程更新。
如果在主线线程之外的线程中直接更新页面显示常会报错。
方法一:
在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。
简单的说:在UI线程中去创建一个handler对象,复写handlemessage方法,然后在workthread中调用handler的sendmessage方法,然后交给UI线程中的handlemessage方法来处理。
代码片段:
updateUIBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
UIHandler UIhandler = new UIHandler();
UIThread thread = new UIThread();
thread.start();
}
});
private class UIHandler extends Handler{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Bundle bundle = msg.getData();
String color = bundle.getString("color");
UITxt.setText(color);
}
}
private class UIThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("color", "黄色");
msg.setData(bundle);
MainActivity.this.UIhandler.sendMessage(msg);
}
方法二:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程.
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// 在这里把返回的数据写在控件上 会出现什么情况尼
loginState.setText(result);
}
});
@Override
public void run() {
// 在这里把返回的数据写在控件上 会出现什么情况尼
loginState.setText(result);
}
});
二:ByteArrayOutputStream
字节数组流:输出流
ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组。
ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组。
ByteArrayoutputStream bout=new ByteArrayOutputStream();
bout.write(int a); bout.write(int b); bout.write(int c);
byte[] buf=bout.toByteArray();//获取内存缓冲中的数据
for(int i=0;i<=buf.length;i++)
{
System.out.println(buf);
}
bout.close();
bout.write(int a); bout.write(int b); bout.write(int c);
byte[] buf=bout.toByteArray();//获取内存缓冲中的数据
for(int i=0;i<=buf.length;i++)
{
System.out.println(buf);
}
bout.close();
例子2
if(urlConnection.getResponseCode()==200)
{
// 获取响应的输入流对象
InputStream in=urlConnection.getInputStream();
// 创建字节输出流对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//定义读取的字节长度
int len=0;
//定义缓冲区大小
byte[] buffer=new byte[1024];
//从输入流中读取的数据放入buffer中
while((len=in.read(buffer))!=-1)//read方法返回的是读取的字节长度,并且存放到了buffer数组中了
{
// 根据读取的长度写入到baos对象中
baos.write(buffer,0,len);
}
//关闭流
in.close();
baos.close();
//返回的请求结果:字符串
final String result=new String(baos.toByteArray());
{
// 获取响应的输入流对象
InputStream in=urlConnection.getInputStream();
// 创建字节输出流对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//定义读取的字节长度
int len=0;
//定义缓冲区大小
byte[] buffer=new byte[1024];
//从输入流中读取的数据放入buffer中
while((len=in.read(buffer))!=-1)//read方法返回的是读取的字节长度,并且存放到了buffer数组中了
{
// 根据读取的长度写入到baos对象中
baos.write(buffer,0,len);
}
//关闭流
in.close();
baos.close();
//返回的请求结果:字符串
final String result=new String(baos.toByteArray());
网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,
1、URLEncoder
类java.net.URLEncoder包括一个简单的静态方法encode( ), 它对string以如下规则进行编码:
public static String encode(String s)
这个方法总是用它所在平台的默认编码形式,所以在不同系统上,它就会产生不同的结果。结果java1.4中,这个方法被另一种方法取代了。该方法要求你自己指定编码形式:
public static String encode(String s, String encoding) throws UnsupportedEncodingException