* 需求 : 

根据网址获取网页的源代码

 思路 : 

与前面的网络图片查看器相似.

进行网络访问,连接服务器获取网页源码的操作,只能放在子线程中进行了。而获取控件进行界面修改的操作只能放在主线程中了。

所以,必须将获得的源码从子线程中传到主线程中去,这就要用到了Handler机制了。



 * 注意 : 网页上的源码是用的什么编码集,对应的也要用相应的编码集,否则会出现乱码.



- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


需求 :

* 首先,定义个方法 getYuanMaFromNet ,专门用来进行访问网络,获得源码的操作.

步骤 :

* 1,将网页的地址变成个URL对象。

* 2,通过该URL对象得到个HttpURLConnection连接对象。

* 3,给该连接对象设置好请求方式,连接超时的时间,以及读取内容超时的时间,然后开始连接服务器。

* 4,获得该链接的返回码。

* 5,如果该返回码为200,则表示连接服务器成功,那么就获取该连接的输入流。

* 6,从输入流中提取出网页的源代码.


代码 :

//自定义个方法用来获取网页源码
    public String getYuanMaFromNet(String url)
    {
    	try {
    		<span style="white-space:pre">	</span>//1,将网页的地址变成个URL对象。
			URL u = new URL(url);
			//2,通过该URL对象得到个HttpURLConnection连接对象。
			HttpURLConnection conn = (HttpURLConnection)u.openConnection();
			//3,给该连接对象设置好请求方式,连接超时的时间,以及读取内容超时的时间,然后开始连接服务器。
			conn.setRequestMethod("GET");//必须大写
			conn.setConnectTimeout(5000);//设置连接的超时时间为5s
			conn.setReadTimeout(5000);//设置读取的超时时间为5s
			conn.connect();//开始连接服务器
			//4,获得该连接的返回码
			int responseCode = conn.getResponseCode();
			if(responseCode == 200)//5,如果返回码为200,则表示连接成功,可以开始获取该链接的输入流
			{
				InputStream is = conn.getInputStream();
				//6,从输入流中提取出网页的源代码.
				BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
				StringBuffer sb = new StringBuffer();
				String text = null;
				while((text = br.readLine()) != null)
				{
					sb.append(text+"/r/n");
				}
				String yuanMa = sb.toString();
				br.close();
				//将获得的源码返回
				return yuanMa;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return null;
    }





- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


需求 :

将获得的源码显示在手机界面上

思路 : 

*  A,准备好布局文件和权限的添加.

 *  B,在主线程中获取需要的控件,
 *  C, 然后开启一个子线程,在子线程中进行访问网络,获取网页源码的操作.
 *  D,在主线程中定义个Handler,并重写handleMessage方法
 *  E,在子线程中将获取到的网页源码用Handler发送到主线程中去.
 *  F,在主线程中将网页源码显示在界面上.


代码 :

public class MainActivity extends Activity {
    private EditText editText;
	private TextView textView;
	//D,在主线程中定义个Handler,并重写handleMessage方法,获取子线程发来的网页源码
	private Handler handler = new Handler(){

		public void handleMessage(Message msg) {
			//获取子线程发来的网页源码
			String yuanMa = (String)msg.obj;
			//	F,在主线程中将网页源码显示在界面上,修改界面的操作只能在主线程中进行
			textView.setText(yuanMa);
		}
		
	};
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //B,在主线程中获取需要的控件,
        editText = (EditText) findViewById(R.id.editText);
        textView = (TextView) findViewById(R.id.textView);
    }
    
    public void onClick(View v)
    {
    	//C,	然后开启一个子线程,在子线程中进行访问网络,获取网页源码的操作.
    	final String url = editText.getText().toString();
    	new Thread(new Runnable() {
			
			public void run() {
				//获取返回的网页源码
				String yuanMa = getYuanMaFromNet(url);
				//E,在子线程中将获取到的网页源码用Handler发送到主线程中去.
				Message msg = new Message();
				msg.obj = yuanMa;
				handler.sendMessage(msg);
			}
		}).start();
    }

}