標籤:
以下是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);}}}
Android訪問網路(可以正常使用)