1. 程式人生 > >做一個程式來查詢手機號碼的歸屬地(使用的是HttpURLConnection的post提交方式)

做一個程式來查詢手機號碼的歸屬地(使用的是HttpURLConnection的post提交方式)


  需求 : 使用post方式向伺服器提供手機號,來查詢手機號的歸屬地
  
  思路 :
  在網路上有一個web伺服器,專門用來提供手機號的歸屬地資訊,
  我們要做的就是訪問該伺服器,提供手機號,然後獲取伺服器發來的響應碼,

  從響應碼中解析出需要的歸屬地資訊.

  步驟 :
  1,定義好佈局檔案以及許可權的新增。
  2,在主執行緒中獲取需要的控制元件.
  3,開啟一個子執行緒,在子執行緒中定義好一個URL,使用該URL物件得到一個HttpURLConnection連線物件.
  4,給該連線物件設定好請求方式,請求超時時間,讀取超時時間。
  5,給該連線設定一個向伺服器寫資料的允許,然後開始向伺服器寫資料,將手機號資訊傳送給伺服器
  6,連線伺服器,得到伺服器的返回碼,判斷連線成功沒,如果返回碼為200,則開始獲取伺服器發來的資料
  7,在主執行緒中定義一個Handler,並重寫handleMessage方法。
  8,在子執行緒中,將服務端傳送來的資料使用sendMessage傳送到主執行緒中去

  9,在主執行緒中的 handleMessage收到資訊後,將該資訊顯示在介面上.

  注意 :  post提交時,要先向服務端傳送了資料後,才能開始連線伺服器。
    即 : 
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
必須放在
conn.connect();前面.
否則會報 java.lang.IllegalStateException: Already connected

程式碼 :

public class MainActivity extends Activity {
    private EditText editText;
    private TextView textView;
    //7,在主執行緒中定義一個Handler,並重寫handleMessage方法。
    private Handler handler = new Handler(){

		public void handleMessage(Message msg) {
			//9,在主執行緒中的 handleMessage收到資訊後,將該資訊顯示在介面上.
			String text = (String) msg.obj;
			textView.setText(text);
		}    	
    };
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //2,在主執行緒中獲取需要的控制元件.
        editText = (EditText) findViewById(R.id.editText);
        textView = (TextView) findViewById(R.id.textView);
    }
    //點選事件
    public void onClick(View v)
    {
    	//獲取輸入框中的手機號碼
    	final String phone = editText.getText().toString();
    	final String data = "mobileCode="+phone+"&userID=";
    	final String url = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo";
    	//3,開啟一個子執行緒,在子執行緒中定義好一個URL,使用該URL物件得到一個HttpURLConnection連線物件.
    	new Thread(new Runnable() {
			
			public void run() {
				try {
					URL u = new URL(url);
					HttpURLConnection conn = (HttpURLConnection) u.openConnection();
					//4,給該連線物件設定好請求方式,請求超時時間,讀取超時時間。
					conn.setRequestMethod("POST");//依然要大寫
					conn.setReadTimeout(5000);
					conn.setConnectTimeout(5000);
					
					//5,給該連線設定一個向伺服器寫資料的允許,然後開始向伺服器寫資料,將資料傳送給伺服器
					conn.setDoOutput(true);
					OutputStream out = conn.getOutputStream();
					out.write(data.getBytes());
					//6,連線伺服器,得到伺服器的返回碼,判斷連線成功沒,如果返回碼為200,則開始獲取伺服器發來的資料
					conn.connect();
					int responseCode = conn.getResponseCode();
					if(responseCode == 200)
					{
						InputStream is = conn.getInputStream();
						//自定義個方法,用來提取出經輸入流傳送來的資料
						String text = getStringFromInputStream(is);
						//8,在子執行緒中,將服務端傳送來的資料使用 handler 傳送到主執行緒中
						Message msg = new Message();
						msg.obj = text;
						handler.sendMessage(msg);
					}
					
					out.close();
					conn.disconnect();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();
    }
    //自定義個方法,用來將傳進來的輸入流中的需要的資訊提取出來,再返回去
	protected String getStringFromInputStream(InputStream is) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		StringBuffer sb = new StringBuffer();
		String text = null;
		while((text = br.readLine()) != null)
		{
			sb.append(text+"/r/n");
		}
		text = sb.toString();
		int start = text.indexOf("\">")+2;
		int end = text.indexOf("</");
		text = text.substring(start, end);
		br.close();
		return text;
	}
}