編輯:關於Android編程
最近項目中要做一個帶進度條的上傳文件的功能,學習了AsyncTask,使用起來比較方便,將幾個方法實現就行,另外做了一個很簡單的demo,希望能對大家有幫助,在程序中設好文件路徑和服務器IP即可。
demo運行截圖:
AsyncTask是抽象類,子類必須實現抽象方法doInBackground(Params... p),在此方法中實現任務的執行工作,比如聯網下載或上傳。AsyncTask定義了三種泛型類型Params,Progress和Result。
1、Params 啟動任務執行的輸入參數,比如HTTP請求的URL,上傳文件的路徑等;
2、Progress 後台任務執行的百分比;
3、Result 後台執行任務的最終返回結果,比如String。
AsyncTask 的執行分為四個步驟,與前面定義的TaskListener類似。每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。在任務的執行過程中,這些方法被自動調用。
1、onPreExecute(), 該方法將在執行實際的後台操作前被UI thread調用。可以在該方法中做一些准備工作,如在界面上顯示一個進度條。
2、doInBackground(Params...), 將在onPreExecute 方法執行後馬上執行,該方法運行在後台線程中。這裡將主要負責執行那些很耗時的後台計算工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
3、onProgressUpdate(Progress...),在publishProgress方法被調用後,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。
4、onPostExecute(Result), 在doInBackground 執行完成後,onPostExecute 方法將被UI thread調用,後台的計算結果將通過該方法傳遞到UI thread.
主進程中使用下面兩行開始異步任務:
mTask = new MyTask(); mTask.execute(filePath, url);
doInBackground()函數中,params[0]和params[1]本別對應execute()的第一個和第二個變量。
private class MyTask extends AsyncTask<String, Integer, String>{ @Override protected void onPostExecute(String result) { //最終結果的顯示 mTvProgress.setText(result); } @Override protected void onPreExecute() { //開始前的准備工作 mTvProgress.setText("loading..."); } @Override protected void onProgressUpdate(Integer... values) { //顯示進度 mPgBar.setProgress(values[0]); mTvProgress.setText("loading..." + values[0] + "%"); } @Override protected String doInBackground(String... params) { //這裡params[0]和params[1]是execute傳入的兩個參數 String filePath = params[0]; String uploadUrl = params[1]; //下面即手機端上傳文件的代碼 String end = "\r\n"; String twoHyphens = "--"; String boundary = "******"; try { URL url = new URL(uploadUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); httpURLConnection.setUseCaches(false); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setConnectTimeout(6*1000); httpURLConnection.setRequestProperty("Connection", "Keep-Alive"); httpURLConnection.setRequestProperty("Charset", "UTF-8"); httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(httpURLConnection .getOutputStream()); dos.writeBytes(twoHyphens + boundary + end); dos .writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filePath.substring(filePath.lastIndexOf("/") + 1) + "\"" + end); dos.writeBytes(end); //獲取文件總大小 FileInputStream fis = new FileInputStream(filePath); long total = fis.available(); byte[] buffer = new byte[8192]; // 8k int count = 0; int length = 0; while ((count = fis.read(buffer)) != -1) { dos.write(buffer, 0, count); //獲取進度,調用publishProgress() length += count; publishProgress((int) ((length / (float) total) * 100)); //這裡是測試時為了演示進度,休眠500毫秒,正常應去掉 Thread.sleep(500); } fis.close(); dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); InputStream is = httpURLConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); @SuppressWarnings("unused") String result = br.readLine(); dos.close(); is.close(); return "上傳成功"; }catch (Exception e) { e.printStackTrace(); return "上傳失敗"; } }
界面中只要一個進度條progressBar 和一個用於顯示的TextView即可。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
最近在慕課網,學習了關於進度條的自定義,有直線型和圓形進度條兩種:需要的文件value目錄下的attrs.xml:
hibernate是非常典型的持久層框架,持久化的思想是非常值得我們學習和研究的。這篇博文,我們主要以實例的形式學習Hibernate,不深究Hibernate的思想和原
學習知識:界面組成、事件監聽器====界面組成====1.用戶界面的基本組件叫做View,都是繼承android.view.View類,Android裡面預定義很多基本的
本文實例講述了Android中ListView下拉刷新的實現方法。分享給大家供大家參考,具體如下:ListView中的下拉刷新是非常常見的,也是經常使用的,看到有很多同學