Android—網路互動之用戶端請求服務端資源

來源:互聯網
上載者:User

最近那個茫然啊,工作不如意,感情不如意,感覺事事不順,在android上又荒廢了些時日。最近因為想做一個APK,主要涉及到網路方面的應用,所以也開始學習之前沒怎麼涉及到的模組。

今天實現要實現的其實很簡單,通過網路擷取服務端一個檔案(可以是txt、png、mp3等等),因為之前是做c#開發的,所以操起老本行,類比一個伺服器,通過url去擷取伺服器的一個資源,就這麼簡單,所以大家千萬千萬不要被嚇著,沒有什麼post請求、沒有什麼get請求,也就是說沒有驗證直接擷取,所有這些post、get通通不涉及。

Android中實現網路連接提供了三種介面以供我們使用:

1、標準java.net.*介面

2、org.Apache.*介面

3、android.net.*介面

我的樣本就是使用第一種介面來實現,來實現從伺服器下載一個txt文檔,我們要實現這個功能要通過幾個步驟實現

1、在sdcard中建立一個檔案,將網路流儲存為txt的最終文字檔

2、實現網路連接,擷取網路流,儲存到sdcard中的txt檔案中

3、建立線程下載伺服器txt文檔

4、類比一個web伺服器(C#)

第一步工作實現過程:首先驗證sdcard狀態(是否載入並且是否可以讀寫),其次獲得(建立)檔案目錄和建立txt檔案,最後初始化一個FileOutputStream對象,他就是實現從資料流到檔案的關鍵紐帶,還有sdcard操作許可權。

參考:http://tdq222.javaeye.com/blog/701962   代碼:

代碼

File dir=null;
File file=null;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Log.v("tag", "---------create file");
//獲得sdcard目錄
dir=Environment.getExternalStorageDirectory();
//在指定目錄建立檔案
file=new File(dir, "test.txt");
}
FileOutputStream fos=null;
try {
fos=new FileOutputStream(file);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

 

代碼

<!-- 在SDCard中建立與刪除檔案許可權 -->  
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入資料許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

第二步工作內容實現過程:首先建立Url連線物件,其次配置串連屬性(是否可以讀取,連線逾時、讀取逾時),最後開啟串連擷取資料流儲存到檔案,還有網路連接許可權。參考:http://java-cofi.javaeye.com/blog/734185 代碼:

代碼

        //緩衝
byte[] bf=new byte[8192];
int current=0;
try {
//建立一個URL對象
URL url=new URL(spec);//spec:資源串連地址
HttpURLConnection connect=(HttpURLConnection)url.openConnection();
//從服務端下載Http資源,設定讀取許可權
connect.setDoInput(true);
// //上傳資源到服務端,設定寫入許可權
// connect.setDoOutput(true);
//設定串連伺服器逾時時間
connect.setConnectTimeout(5*1000);
//設定從伺服器讀取資料逾時時間
connect.setReadTimeout(30*1000);
//獲得網路連接狀態代碼
int code=connect.getResponseCode();
//判斷是否串連成功(HttpURLConnection.HTTP_OK==200,0-200都屬正常)
if(code==HttpURLConnection.HTTP_OK){
// //開啟串連擷取資源(不寫也沒關係,調用getInputStream()預設會開啟串連 // connect.connect();
InputStream is=connect.getInputStream();
BufferedInputStream bis=new BufferedInputStream(is);
while((current=bis.read(bf))!=-1){
fos.write(bf, 0, current);
}
bis.close();
fos.close();
//中斷連線
connect.disconnect();
}

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

 

代碼

<!-- 在SDCard中建立與刪除檔案許可權 -->  
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入資料許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

第三步主要是為了不使下載資源時造成主UI堵塞

代碼

    private Handler handler=new Handler(){
public void handleMessage(Message msg){
//提示使用者下載完成
if(msg.what==1){
Toast.makeText(Main.this, "down succes", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(Main.this, "down fail", Toast.LENGTH_SHORT).show();
}
super.handleMessage(msg);
}
};

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.v("tag", "------------onclick");
//開啟下載線程
Thread thread=new Thread(new downThread());
thread.start();
}

class downThread implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
//下載資源
download();
Message msg=new Message();
msg.what=1;
handler.sendMessage(msg);
}
}

第四步就簡單了,建立一個網站提供一個連結就ok了例如:http://localhost:7643/WebSite1/data/test.txt,但是有一點要注意,將

localhost換成10.0.2.2,這就是原生意思吧(未確認),至此從伺服器擷取資源就實現了,開啟DDMS中sdcard,把test.txt取出來,開啟

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.