Android访问网络(可以正常使用)

以下是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);

		}

	}

}

  

你可能感兴趣的:(android)