handler的使用详解+http联网

来源:互联网 发布:新西兰留学知乎 编辑:程序博客网 时间:2024/06/01 08:59


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.发送延时消息


后续更新....