Android下的聯網下載的操作

一:從網絡下載圖片

MainActivity:

 

 

NetService

 1.由路徑獲取Url

2.使用url打開HttpURLConnection連接

3.根據路徑查找本地sd卡是否有緩存文件,如果文件存在,發送最後修改時間

File file = new File("/mnt/sdcard/" + URLEncoder.encode(path, "UTF-8"));

conn.setIfModifiedSince(file.lastModified());

4.得到響應返回碼,如果返回碼是200,則正確得到網絡連接

5.由連接獲取輸入流,將輸入流寫入到內存,由於是圖片,所以爲byte,

6.將內存中的數據賦給byte數組data,

7.用Bitmap的解碼工廠將數據解碼爲圖片

Bitmap image = BitmapFactory.decodeByteArray(data,0,data.length);

8,爲了以後省流量,快速訪問,將此圖片緩存到本地

二:登錄:

 classicLogin:

  點擊登錄時開始新線程

     1.獲得用戶名與密碼

 2.調用服務層的方法爲用戶名與密碼設置編碼:

Service.post(username,password)

     3.若無異常提示成功,否則提示失敗

 

服務層的方法:

1.設置處理用戶名與密碼的Servlet路徑:

  private String path = "http://192.168.1.100:8080/05.Web/LoginServlet"

 

1.post方法:

  1.Creates a new URL instance by parsing spec.

     URL url = new URL(path);

  2.獲取HttpURLConnection連接

  3.設置連接超時時間

  4.設置請求方法爲post

  5.設置三個請求頭

        conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length", params.getBytes().length + "");

conn.setRequestProperty("Host""192.168.1.100:8080");

   6.Sets the flag indicating whether this URLConnection allows output

conn.setDoOutput(ture);

   7.將得到的用戶名密碼編碼後輸出
username = URLEncoder.encode(username,"utf-8")

conn.getOutputStream().write(username.getBytes());

 8.得到響應碼,若響應碼不是200,則拋出異常。

 

3.get方式:

1.get方式是:http://192.168.1.100:8080/05.Web/LoginServlet?username=xxx&password=xxx

所以在創建URL時應遵照這種格式:

String path =  "http://192.168.1.100:8080/05.Web/LoginServlet";

String params = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8");

URL url = new URL(path + "?" + params);

2.打開HttpURLConnection連接

3.設置連接超時時間

4.設置請求方法

5.開始連接,得到返回碼

6.根據返回碼判斷網絡狀態

4.牛逼的方式:

常見的麻煩的方法已經有人寫好了,自己可以直接拿來調用:

1.MainActivity

private AsyncHttpClient client = new AsyncHttpClient();

2.在點擊登錄時調用clientpostget方法即可:

client.post(url, params, responseHandler)

client.get(url, params, responseHandler)

三:上傳:

   上傳這種常見的麻煩的方法也被同一個牛逼人物寫好了,同上,直接調用

類似的,把將要上傳的文件也放入params:

     RequestParams params = new RequestParams();

     params.put("username", username);

     params.put("password", password);

 params.put("upload"new File(upload));

 

client.post(url, params, new AsyncHttpResponseHandler();

四:下載

1.java中最簡單的下載

1.找到文件所在的路徑:

URL url = new URL(http:xxxx/xx.txt);

2.打開http連接

3.設置連接超時時間

4.設置請求方式

5.開始連接得到響應碼

6.響應碼正確(200)則將由連接得到的輸入流中的數據寫入到本地

2.多線程下載:

     一:DownloadTask:繼承Thread,規定線程數THREAD_AMOUNT = 3;

1.DownloadTask的構造函數中傳入下載地址,從下載地址中截取文件名

2.run方法

a) :打開連接,設置超時時間

b) :獲取文件長度 :conn.getConntentLength();

c) :計算每個線程要下載的長度

d) :開啓所有線程,每個線程會下載一部分數據到本地文件中

New DownloadThread(i).start();

       二:內部類DownloadThread:繼承Thread,構造函數中傳遞的參數用來標記下載任務中的線程

        1.run方法:

a) :設置當前線程要下載的起始位置,結束位置

b) :當前線程打開Http連接,設置超時時間,設置請求下載的範圍

c) :用隨機讀寫文件地文件讀寫,此時同單線程下載操作

3.多線程斷點續傳:

 在多線程的基礎上修改:添加一個臨時文件記錄當前線程下載到了哪一個字節了,然後下次再啓動時,直接從當前臨時文件所記錄的地方接着下載.

:BPDownloadTask中的修改

   a) :BPDownloadTask的構造函數中創建臨時文件.

       b) :run方法啓動時,要判斷臨時文件是否存在,若不存在,則寫入每個線程的開始位置

       c) :開啓線程,每個線程會下載一部分數據到本地文件中

 二:在內部類DownloadThread中的修改

 A):run方法中創建記錄進度的臨時文件.

RandomAccessFile tempRaf = new RandomAccessFile(tempFile"rws");

 B):根據當前線程的id將指針移動到當前線程的位置讀取當前線程已完成的數據

tempRaf.seek(id * 4);

C):多個下載進程之間同步,統計所有線程總共完成了多少

synchronized(BPDownloadTask.this) {

totalFinish += threadFinish;

}

D):計算當前線程起始位置,結束位置,後續同多線程下載.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章