Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android文件下載之進度檢測,android文件下載

Android文件下載之進度檢測,android文件下載

編輯:關於android開發

Android文件下載之進度檢測,android文件下載


  近期因為項目的需要,研究了一下Android文件下載進度顯示的功能實現,接下來就和大家一起分享學習一下,希望對廣大初學者有幫助。
  先上效果圖:

  

  上方的藍色進度條,會根據文件下載量的百分比進行加載,中部的文本控件用來現在文件下載的百分比,最下方的ImageView用來展示下載好的文件,項目的目的就是動態向用戶展示文件的下載量。

  下面看代碼實現:首先是布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ProgressBar
        android:id="@+id/progressBar"
       >public class MainActivity extends Activity {

	ProgressBar pb;   
	TextView tv; 
	ImageView imageView;
    int fileSize;    
    int downLoadFileSize;    
    String fileEx,fileNa,filename;  
    //用來接收線程發送來的文件下載量,進行UI界面的更新
    private Handler handler = new Handler(){    
        @Override    
        public void handleMessage(Message msg)    
        {//定義一個Handler,用於處理下載線程與UI間通訊
          if (!Thread.currentThread().isInterrupted())
          {    
            switch (msg.what)
            {    
              case 0:    
                pb.setMax(fileSize);
              case 1:    
                pb.setProgress(downLoadFileSize);    
                int result = downLoadFileSize * 100 / fileSize;    
                tv.setText(result + "%");    
                break;    
              case 2:    
                Toast.makeText(MainActivity.this, "文件下載完成", Toast.LENGTH_SHORT).show();   
                FileInputStream fis = null;
				try {
					fis = new FileInputStream(Environment.getExternalStorageDirectory() + File.separator + "/ceshi/" + filename);
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}
                Bitmap bitmap = BitmapFactory.decodeStream(fis);  ///把流轉化為Bitmap圖
                imageView.setImageBitmap(bitmap);
                break;    
     
              case -1:    
                String error = msg.getData().getString("error");
                Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();    
                break;    
            }    
          }    
          super.handleMessage(msg);    
        }    
      };
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pb=(ProgressBar)findViewById(R.id.progressBar);
        tv=(TextView)findViewById(R.id.textView);
        imageView = (ImageView) findViewById(R.id.imageView);
        tv.setText("0%");
        new Thread(){
            public void run(){
                try {
                	//下載文件,參數:第一個URL,第二個存放路徑
                	down_file("http://cdnq.duitang.com/uploads/item/201406/15/20140615203435_ABQMa.jpeg", Environment.getExternalStorageDirectory() + File.separator + "/ceshi/");
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
            }    
        }.start();    
     
    }    
	
	/**
	 * 文件下載
	 * @param url:文件的下載地址
	 * @param path:文件保存到本地的地址
	 * @throws IOException
	 */
    public void down_file(String url,String path) throws IOException{    
        //下載函數          
        filename=url.substring(url.lastIndexOf("/") + 1);
        //獲取文件名    
        URL myURL = new URL(url);
        URLConnection conn = myURL.openConnection();    
        conn.connect();    
        InputStream is = conn.getInputStream();    
        this.fileSize = conn.getContentLength();//根據響應獲取文件大小    
        if (this.fileSize <= 0) throw new RuntimeException("無法獲知文件大小 ");    
        if (is == null) throw new RuntimeException("stream is null"); 
        File file1 = new File(path);
        File file2 = new File(path+filename);
        if(!file1.exists()){
        	file1.mkdirs();
        }
        if(!file2.exists()){
        	file2.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(path+filename);    
        //把數據存入路徑+文件名    
        byte buf[] = new byte[1024];
        downLoadFileSize = 0;    
        sendMsg(0);    
        do{    
            //循環讀取    
            int numread = is.read(buf);    
            if (numread == -1)    
            {    
              break;    
            }    
            fos.write(buf, 0, numread);    
            downLoadFileSize += numread;    
     
            sendMsg(1);//更新進度條    
        } while (true);  
        
        sendMsg(2);//通知下載完成    
        
        try{    
            is.close();    
        } catch (Exception ex) {    
            Log.e("tag", "error: " + ex.getMessage(), ex);    
        }    
     
    }    
    
    //在線程中向Handler發送文件的下載量,進行UI界面的更新
    private void sendMsg(int flag)    
    {    
        Message msg = new Message();    
        msg.what = flag;    
        handler.sendMessage(msg);    
    }        
     
}

  最後一定要注意的是:在AndroidManifest.xml文件中,添加訪問網絡的權限

<uses-permission android:name="android.permission.INTERNET"/>

  到這裡關於Android文件下載動態顯示下載進度的小demo就為大家分享完畢,希望對大家的學習有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved