標籤:
安卓開發軟體:AndroidStudio
伺服器軟體:Myeclipse+Tomcat
首先無論是哪種方式,安卓手機軟體要想連網,必須要申請連網許可權(android.permission.INTERNET)。
安卓主線程不允許做耗時操作(連網操作就是一種耗時操作),所以下面的的網路操作都是通過內部匿名類另起的一個線程操作的。
一,第一種方式:使用HttpURLConnection進行連網操作
這個方法需要我們手動構建一個http請求包,發送到指定的伺服器
- get方式
- 設定URL
- 開啟串連
- 佈建要求方法為get
- 設定連線逾時時間
- 設定讀取逾時時間
- 把當前的request發送到伺服器端
- 等待伺服器的響應(此處會阻塞)
- 獲得響應碼(並在響應碼中做相應的操作),因為安卓子線程內不允許做UI更新的操作,所以需要轉到主線程來做(通過安卓中的handler來將資訊傳遞到主線程)
public void getPic(View v){ new Thread(new Runnable() { @Override public void run() { try { //首先要支出伺服器的地址 URL url=new URL("http://192.168.2.1/day10_NetworkServer/brushli.jpg"); //通過http串連 HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection(); //佈建要求方式,並設定等待回應時間 httpurlConnection.setRequestMethod("GET"); httpurlConnection.setConnectTimeout(5000); //把當前的request發送到伺服器(安卓不允許在主線程內做耗時操作,如串連伺服器) httpurlConnection.connect(); //發送完串連後等待操作,這個是阻塞式方法, int responseCode = httpurlConnection.getResponseCode(); //根據得到的響應代碼和response的資訊作出相應的操作 if(responseCode==200){ //從伺服器讀取正確與否的資訊 InputStream is=httpurlConnection.getInputStream(); File file=new File("/data/data/com.rgd.day10_network_3/files"); file.mkdir(); FileOutputStream fos=new FileOutputStream(new File("/data/data/com.rgd.day10_network_3/files/brushli.jpg")); byte[] buffer=new byte[1024]; int read; while ((read =is.read(buffer))!=-1){ fos.write(buffer,0,read); } //由於子線程不允許做UI更新操作,與要通過Handler進行和主線程的通訊操作 Message msg=new Message(); msg.what=1; handler.sendMessage(msg); fos.close(); is.close(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); }Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what){ case 1: Toast.makeText(MainActivity.this, "儲存圖片成功", Toast.LENGTH_LONG).show(); break; case 2: Toast.makeText(MainActivity.this,"儲存MP3成功",Toast.LENGTH_LONG).show(); break; case 3: Toast.makeText(MainActivity.this,"儲存視頻成功",Toast.LENGTH_SHORT).show(); default: break; } } };View Code
2.post方式
-
- 操作跟get差不多,除了post傳遞資訊是通過本文傳遞的,而get是放在串連中的
new Thread(new Runnable() { @Override public void run() { try { //首先要支出伺服器的地址 URL url=new URL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo"); //通過http串連 HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection(); //佈建要求方式,並設定等待回應時間 httpurlConnection.setRequestMethod("POST"); httpurlConnection.setConnectTimeout(5000); String data="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber; OutputStream outputStream = httpurlConnection.getOutputStream(); outputStream.write(data.getBytes()); //把當前的request發送到伺服器(安卓不允許在主線程內做耗時操作,如串連伺服器) httpurlConnection.connect(); //發送完串連後等待操作,這個是阻塞式方法, int responseCode = httpurlConnection.getResponseCode(); //根據得到的響應代碼和response的資訊作出相應的操作 if(responseCode==200){ //從伺服器讀取正確與否的資訊 InputStream is=httpurlConnection.getInputStream(); byte[] buffer=new byte[1024]; int read = is.read(buffer); String result=new String(buffer,0,read); //由於子線程不允許做UI更新操作,與要通過Handler進行和主線程的通訊操作 Message msg=new Message(); msg.what=1; handler.sendMessage(msg); }else{ Message msg=new Message(); msg.what=-1; handler.sendMessage(msg); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start();View Code
3.通過
Android網路操作的幾種方法