一:從網絡下載圖片
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.在點擊登錄時調用client的post或get方法即可:
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):計算當前線程起始位置,結束位置,後續同多線程下載.