編輯:關於Android編程
在Android中斷點下載用的很多,看了黎活明老師的教程之後,對斷點下載也有一定的認識,然後跟大家分享。
首先,斷點下載他的功能描述:用戶可以從網絡上下載任意的資源,使用斷點下載的好處就是:當用戶由於一些其他的原因退出了本應用,但是此時正在下載者一些文件,當用戶再次點進本應用的時候,我們不應該讓用戶重新下載該文件,而是從上次下載完成的那個地方開始繼續下載,這就是斷點下載的功能。
實現思路:從網絡下載資源,需要使用到HTTP協議(如果是資源比較大的建議使用socket,比如上百M的),需要使用到多線程,Android4.x之後不允許在UI線程訪問網絡,所以我們需要使用多線程,或者是異步任務,volley等其他,然後因為需要當用戶退出應用再進入的時候讀取原來的下載進度,因此我們需要使用到SQLite技術,用於保存每一條線程的下載進度,每當用於再次進入的時候可以從數據庫讀取數據然後傳到線程那裡,從他以前停止下載的位置開始下載。
下面是一些源碼分析:
這是MainActivity.java
public class MainActivity extends Activity { /* * 下載路徑text */ private EditText pathText; /* * 下載結果顯示 */ private TextView resultView; /* * 點擊下載button */ private Button downloadButton; /* * 點擊停止button */ private Button stopbutton; /* * 顯示進度progressBar */ private ProgressBar progressBar; /* * hanlder的作用是用於往創建Hander對象所在的線程所綁定的消息隊列發送消息 * 這裡是UI線程的Handler,改變progressBar,resultText */ private Handler handler = new UIHander(); private final class UIHander extends Handler{ public void handleMessage(Message msg) { switch (msg.what) { case 1: int size = msg.getData().getInt("size"); progressBar.setProgress(size); float num = (float)progressBar.getProgress() / (float)progressBar.getMax(); int result = (int)(num * 100); resultView.setText(result+ "%"); //progressBar達到最大值,下載完成 if(progressBar.getProgress() == progressBar.getMax()){ Toast.makeText(getApplicationContext(), R.string.success, 1).show(); } break; case -1: //下載失敗 Toast.makeText(getApplicationContext(), R.string.error, 1).show(); break; } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* * 初始化各個UI */ pathText = (EditText) this.findViewById(R.id.path); resultView = (TextView) this.findViewById(R.id.resultView); downloadButton = (Button) this.findViewById(R.id.downloadbutton); stopbutton = (Button) this.findViewById(R.id.stopbutton); progressBar = (ProgressBar) this.findViewById(R.id.progressBar); /* * 設置點擊時間 */ ButtonClickListener listener = new ButtonClickListener(); downloadButton.setOnClickListener(listener); stopbutton.setOnClickListener(listener); } private final class ButtonClickListener implements View.OnClickListener{ public void onClick(View v) { switch (v.getId()) { /* * 下載按鈕 */ case R.id.downloadbutton: String path = pathText.getText().toString(); if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File saveDir = Environment.getExternalStorageDirectory();//獲取保存路徑 download(path, saveDir);//開始下載 }else{ //內存卡出錯 Toast.makeText(getApplicationContext(), R.string.sdcarderror, 1).show(); } downloadButton.setEnabled(false);//設置下載按鈕不可用 stopbutton.setEnabled(true);//設置停止下載按鈕可用 break; //停止下載 case R.id.stopbutton: this.task.exit();//退出下載,即是去讓線程停止下載 downloadButton.setEnabled(true);//下載按鈕可用 stopbutton.setEnabled(false);//停止下載按鈕不可用 break; } } private DownloadTask task; private void download(String path, File saveDir) {//運行在主線程 task = new DownloadTask(path, saveDir); new Thread(task).start(); } /* * UI控件畫面的重繪(更新)是由主線程負責處理的,如果在子線程中更新UI控件的值,更新後的值不會重繪到屏幕上 * 一定要在主線程裡更新UI控件的值,這樣才能在屏幕上顯示出來,不能在子線程中更新UI控件的值 */ private final class DownloadTask implements Runnable{ private String path; private File saveDir; private FileDownloader loader; public DownloadTask(String path, File saveDir) { this.path = path; this.saveDir = saveDir; } /** * 退出下載 */ public void exit(){ if(loader!=null) loader.exit(); } public void run() { try { loader = new FileDownloader(getApplicationContext(), path, saveDir, 3);//開啟三條線程下載 progressBar.setMax(loader.getFileSize());//設置進度條的最大刻度,為文件的長度 loader.download(new DownloadProgressListener() { public void onDownloadSize(int size) { Message msg = new Message(); msg.what = 1; msg.getData().putInt("size", size);//把已經下載的長度傳給UI線程,在progressbar中顯示 handler.sendMessage(msg); } }); } catch (Exception e) { e.printStackTrace(); handler.sendMessage(handler.obtainMessage(-1)); } } } } }
百學須先立志—學前須知:在我們平時加載圖片(不管是下載還是加載本地圖片…..)的時候,我們經常會遇到這樣一個需求,那就是當圖片正在加載時應該呈現
本文實例講述了Android編程實現換膚功能的方法。分享給大家供大家參考,具體如下:本系列專題培訓適用范圍:初級Android程序員,即有J2SE基礎和Android初級
(一)概述學完上一節,相信你已經知道如何去使用系統提供的ContentProvider或者自定義ContentProvider了, 已經基本滿足日常開發的需求了,有趣的是
MediaRecorder/MediaPlayer在Android手機上面,音頻的處理比視頻還要復雜,這真是出人意料。在前面的博文《Android開發筆記(五十七)錄像錄