以下是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();@Overrideprotected 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{@Overridepublic 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{@Overridepublic 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 = "我是空";@Overridepublic void run() {System.out.println("线程名:"+Thread.currentThread().getName());//获取EditText 控件里的 uriString 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();//获取请求对象,并传入uriHttpGet 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);}}}

  

更多相关文章

  1. 使用过时的HttpClient
  2. Android(安卓)---js与java的相互调用
  3. android音量设置from top to bottom
  4. android 屏幕分辨率与密度,dip与px的区别(整合自网络资源)
  5. android尝鲜
  6. 【Android】Web开发之显示网络图片的两种方法
  7. Android的postOnAnimation分析
  8. android 手机虚拟按键 震动过程的追溯(1)
  9. Android(安卓)之 远程图片获取和本地缓存

随机推荐

  1. 一个简单的SQL 行列转换语句
  2. SQLServer 常用语句(按功能分)
  3. Linq to SQL 插入数据时的一个问题
  4. sql语言中delete删除命令语句详解
  5. SQL 查询分析中使用net命令问题
  6. SQLServer 批量导入目录文件
  7. SQL Server 触发器 表的特定字段更新时,触
  8. SQLServer中求两个字符串的交集
  9. 被遗忘的SQLServer比较运算符谓词
  10. SQLServer XML查询快速入门(18句话)