安卓开发,获取网页源代码,需要了解Handler

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

_ueditor_page_break_tag_

Handler一些特点

handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)

它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中,sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据
以下为一个实例,它实现的功能为 : 通过线程修改界面textView1的内容

package com.example.firstproject;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.content.Intent;
public class SecondActivity extends Activity {
 Button button;
    MyHandler myHandler;
    TextView textView1;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_second);
  
  Intent SecondIntent=getIntent();
  String TempId= SecondIntent.getStringExtra("postid");
  TextView post_id=(TextView)findViewById(R.id.editText1);
  post_id.setText(TempId);
  
  textView1=(TextView)findViewById(R.id.editText2);
  button = (Button) findViewById(R.id.button1);
  myHandler = new MyHandler();
  MyThread m = new MyThread();
  new Thread(m).start();
 }
 
// public void getWebHttp(View view)
// {
//  new Thread(){
//   @Override
//   public void run(){
//    TextView postIdP=(TextView)findViewById(R.id.editText1);
//    String tempContent=posturl("http://www.daidaiwa.com");
//    TextView editText=(TextView)findViewById(R.id.editText2);
//    editText.setText(tempContent);
//   }
//  }.start();
//  
// }
 public void getWebHttp(View view) throws IOException
 {
  TextView postIdP=(TextView)findViewById(R.id.editText1);
  String tempContent=posturl("http://www.daidaiwa.com");
  TextView editText=(TextView)findViewById(R.id.editText2);
  
  
  URL url=new URL("http://www.taobao.com/robots.txt");
  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  connection.setRequestMethod("GET");
  connection.setReadTimeout(5000);
  InputStream inStream= connection.getInputStream();
  ByteArrayOutputStream data=new ByteArrayOutputStream();//新建一字节数组输出流
  byte[] buffer = new byte[1024];//在内存中开辟一段缓冲区,接受网络输入流
  int len=0;
  while((len=inStream.read(buffer))!=-1){
  data.write(buffer, 0, len); //缓冲区满了之后将缓冲区的内容写到输出流
  }
  inStream.close();
  tempContent=new String(data.toByteArray(),"utf-8");//最后可以将得到的输出流转成utf-8编码的字符串,便可进一步处理
  editText.setText(tempContent);
 }
 
 public String posturl(String url){
     InputStream is =null;
     String result ="";
  
     try{
         HttpClient httpclient =new DefaultHttpClient();
         HttpPost httppost =new HttpPost(url);
         HttpResponse response = httpclient.execute(httppost);
         HttpEntity entity = response.getEntity();
         is = entity.getContent();
     }catch(Exception e){
         return"Fail to establish http connection!"+e.toString();
     }
  
     try{
         BufferedReader reader =new BufferedReader(new InputStreamReader(is,"utf-8"));
         StringBuilder sb =new StringBuilder();
         String line =null;
         while((line = reader.readLine()) != null) {
             sb.append(line +"\n");
         }
         is.close();
  
         result=sb.toString();
     }catch(Exception e){
         return"Fail to convert net stream!";
     }
     return result;
 }
 
    /**
     * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
     * */
     class MyHandler extends Handler {
         public MyHandler() {
         }
         public MyHandler(Looper L) {
             super(L);
         }
         // 子类必须重写此方法,接受数据
         @Override
         public void handleMessage(Message msg) {
             // TODO Auto-generated method stub
             Log.d("MyHandler", "handleMessage......");
             super.handleMessage(msg);
             // 此处可以更新UI
             Bundle b = msg.getData();
             String color = b.getString("color");
             SecondActivity.this.textView1.append(color);
         }
     }
     class MyThread implements Runnable {
         public void run() {
             try {
                 Thread.sleep(10000);
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             Log.d("thread.......", "mThread........");
             Message msg = new Message();
             Bundle b = new Bundle();// 存放数据
             
             String msgTxt=posturl("http://www.daidaiwa.com/");
             
             b.putString("color", msgTxt);
             msg.setData(b);
             SecondActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
         }
     }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.second, menu);
  return true;
 }
}

参考学习:1.http://blog.csdn.net/zzp_403184692/article/details/8144350
                    2.http://www.cnblogs.com/devinzhang/archive/2011/12/30/2306980.html
                    3.http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html

最后修改:2013 年 08 月 28 日
如果觉得我的文章对你有用,请随意赞赏