綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[教程] Android客戶端請求服務端資源教程

[複製連結] 查看: 1387|回覆: 2|好評: 0
跳轉到指定樓層
樓主
暗桌之光 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2011-6-14 15:23

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
今天實現要實現的其實很簡單,通過網絡獲取服務端一個文件(可以是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操作權限。
  1. File dir=null;
  2. File file=null;
  3. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  4.     Log.v("tag", "---------create file");
  5.     //獲得sdcard目錄
  6.     dir=Environment.getExternalStorageDirectory();
  7.     //在指定目錄新建文件
  8.     file=new File(dir, "test.txt");
  9. }
  10. FileOutputStream fos=null;
  11. try {
  12.     fos=new FileOutputStream(file);
  13. } catch (FileNotFoundException e1) {
  14.     // TODO Auto-generated catch block
  15.     e1.printStackTrace();
  16. }
  17. <!-- 在SDCard中創建與刪除文件權限 -->  
  18. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  19. <!-- 往SDCard寫入數據權限 -->  
  20. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
複製代碼
第二步工作內容實現過程:首先創建Url連接對象,其次配置連接屬性(是否可以讀取,連接超時、讀取超時),最後打開連接獲取數據流保存到文件,還有網絡連接權限。代碼:
  1. //緩存
  2. byte[] bf=new byte[8192];
  3. int current=0;
  4. try {
  5. //創建一個URL對像
  6. URL url=new URL(spec);//spec:資源連接地址
  7. HttpURLConnection connect=(HttpURLConnection)url.openConnection();
  8. //從服務端下載Http資源,設置讀取權限
  9. connect.setDoInput(true);
  10. // //上傳資源到服務端,設置寫入權限
  11. // connect.setDoOutput(true);
  12. //設置連接服務器超時時間
  13. connect.setConnectTimeout(5*1000);
  14. //設置從服務器讀取數據超時時間
  15. connect.setReadTimeout(30*1000);
  16. //獲得網絡連接狀態碼
  17. int code=connect.getResponseCode();
  18. //判斷是否連接成功(HttpURLConnection.HTTP_OK==200,0-200都屬正常)
  19. if(code==HttpURLConnection.HTTP_OK){
  20. // //打開連接獲取資源(不寫也沒關係,調用getInputStream()默認會打開連接
  21. // connect.connect();
  22. InputStream is=connect.getInputStream();
  23. BufferedInputStream bis=new BufferedInputStream(is);
  24. while((current=bis.read(bf))!=-1){
  25. fos.write(bf, 0, current);
  26. }
  27. bis.close();
  28. fos.close();
  29. //斷開連接
  30. connect.disconnect();
  31. }

  32. } catch (MalformedURLException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. <!-- 在SDCard中創建與刪除文件權限 -->  
  40. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  41. <!-- 往SDCard寫入數據權限 -->  
  42. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
複製代碼
第三步主要是為了不使下載資源時造成主UI堵塞
  1.     private Handler handler=new Handler(){
  2.         public void handleMessage(Message msg){
  3.             //提示用戶下載完成
  4.             if(msg.what==1){
  5.                 Toast.makeText(Main.this, "down succes", Toast.LENGTH_SHORT).show();
  6.             }else{
  7.                 Toast.makeText(Main.this, "down fail", Toast.LENGTH_SHORT).show();
  8.             }
  9.             super.handleMessage(msg);
  10.         }
  11.     };

  12.     @Override
  13.     public void onClick(View v) {
  14.         // TODO Auto-generated method stub
  15.         Log.v("tag", "------------onclick");
  16.         //開啟下載線程
  17.         Thread thread=new Thread(new downThread());
  18.         thread.start();
  19.     }
  20.    
  21.     class downThread implements Runnable{

  22.         @Override
  23.         public void run() {
  24.             // TODO Auto-generated method stub
  25.             //下載資源
  26.             download();
  27.             Message msg=new Message();
  28.             msg.what=1;
  29.             handler.sendMessage(msg);
  30.         }
  31.     }
複製代碼
第四步就簡單了,新建一個網站提供一個鏈接就ok了例如:http://localhost:7643/WebSite1/data/test.txt,但是有一點要注意,將

localhost換成10.0.2.2,這就是本機的意思吧(未確認),至此從服務器獲取資源就實現了,打開DDMS中sdcard,把test.txt取出來,打開如圖:
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 2碎鑽 +5 幫助 +1 收起 理由
idvtw + 1
y776 + 5 支持一下

查看全部評分

收藏收藏1 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
沙發
牙痕王 | 收聽TA | 只看該作者
發表於 2011-6-19 00:10
感謝大大的分享~
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
ykh8569 | 收聽TA | 只看該作者
發表於 2012-11-20 12:54
暗桌之光 大大
如果我想在手機
輸入一串字後 把這串字存入SD內的TXT檔..再把這TXT檔上傳到FTP的一個固定的資料夾
我該如何實作?
{FTP可正常存取}
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則