以下是MainActiviy.java,有必要的注释,里面用到了handler,以及线程,workThread如何更新mainThread才能够更新的内容。
package com.wyl.httptest2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends ActionBarActivity { Button btn; Button btn2; EditText et; Handler myhandler = new myHandler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button)findViewById(R.id.btnId); btn2 = (Button)findViewById(R.id.btnId2); MyOnclickListener l = new MyOnclickListener(); et = (EditText)findViewById(R.id.editTextId); btn.setOnClickListener(l);//绑定监听器 btn2.setOnClickListener(l); } class MyOnclickListener implements OnClickListener{ @Override public void onClick(View v) { if(v.getId()==R.id.btnId){ //原则:UI中的主线程不能够直接访问网络 System.out.println("====线程名:"+Thread.currentThread().getName()); getInternetThread myThread = new getInternetThread(); myThread.start(); }else if(v.getId()==R.id.btnId2){ System.out.println("你点了清除按钮,"); //如果是清除按钮,那么editText中的内容 et.setText(""); } } } /* * 原理:因为Looper会自动地从队列里去取数据,然后自动调用继承了Handler对象的类的复写了的 * public void handleMessage(Message msg){}这个方法。 * 继承Handler的目的: * 为了把从workThread获取的数据写入到UI中(Android中UI线程,即主线程是不能够访问网络的) * @author Administrator * */ class myHandler extends Handler{ @Override public void handleMessage(Message msg) { //打印出来是main线程,这样我们就可以直接把msg的值取出来了, System.out.println("====我是什么线程呢:"+Thread.currentThread().getName()); //取出msg(取出msg.obj),这个绑定的obj属性才是我们真正要的值 String fhz = (String)msg.obj; et.setText(fhz); } } /* * 主线程(即前台点击事件相关的线程)不能够直接访问网络,那么就通过主线程启动 * getInternetThread这个新线程(肯定就是workThread了),然后通过这个workThread进行 * 网络的访问,并且这个线程把网络数据绑定到msg的obj属性上(只要走到这一步就行了,update * 前台UI中的数据只需要交给继承了Handler的类的复写的Handler中的public void handleMessage(Message msg) * 这个方法,这个方法会自动执行。) * @author Administrator * */ class getInternetThread extends Thread{ String line = "我是空"; @Override public void run() { System.out.println("线程名:"+Thread.currentThread().getName()); //获取EditText 控件里的 uri String uri = et.getText().toString(); if(!uri.contains("http://")){ //如果网址不包含htt://的话那么就不能够正常访问网络 Message m = myhandler.obtainMessage(); m.obj = "仙人板板的,你的网址没有http://!!!"; myhandler.sendMessage(m); return; } System.out.println("uri的值:"+uri); //访问网络 //获取客户端对象 HttpClient client = new DefaultHttpClient(); //获取请求对象,并传入uri HttpGet get = new HttpGet(uri); //客户端发送请求对象 try { HttpResponse resp = client.execute(get); //获取状态码,如果是200说明成功 int code = resp.getStatusLine().getStatusCode(); if(code == 200){ //获得返回值 InputStream in = resp.getEntity().getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); line = reader.readLine(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // et.setText(line);//设置EditText的值 Message msg = myhandler.obtainMessage(); msg.obj = line;//这一步就把我们需要写到UI中的内容绑定到了msg上 myhandler.sendMessage(msg); } } }