Android 中下载文件到sdcard和进度条小结


这里小结下,如何用Android的模拟器去创建一个sdcard,并且学习如何在android中去下载一个网上的文件,保存到android,并且下载时,会显示一个进度条.上述讲的就是我们这一篇代码要实现的内容。这篇内容其实是很重要的,大家可要好好的看了哦。
 
1 页面结构,提供一个button,点BUTTON时,去下载一个图片,main.xml设计如下:

Java代码:
  1. < ?xml version="1.0" encoding="utf-8"?>
  2. < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. < TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello"
  11. />
  12. < Button
  13. android:text="Start long running task.."
  14. android:id="@+id/startBtn"
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content">
  17. < /Button>
  18. < /LinearLayout>
复制代码


       2 主程序

Java代码:

  1. package eoe.liao;
  2. import java.io.BufferedInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.URL;
  7. import java.net.URLConnection;
  8. import android.app.Activity;
  9. import android.app.Dialog;
  10. import android.app.ProgressDialog;
  11. import android.os.AsyncTask;
  12. import android.os.Bundle;
  13. import android.util.Log;
  14. import android.view.View;
  15. import android.view.View.OnClickListener;
  16. import android.widget.Button;
  17. public class AndroAsync extends Activity {
  18. public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
  19. private Button startBtn;
  20. private ProgressDialog mProgressDialog;
  21. /** Called when the activity is first created. */
  22. @Override
  23. public void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. startBtn = (Button)findViewById(R.id.startBtn);
  27. startBtn.setOnClickListener(new OnClickListener(){
  28. public void onClick(View v) {
  29. startDownload();
  30. }
  31. });
  32. }
  33. private void startDownload() {
  34. String url = "http://image-7.verycd.com/0d7596f5db7df1742236466dc91311b1435702(120x120)/thumb.jpg";
  35. new DownloadFileAsync().execute(url);
  36. }
  37. @Override
  38. protected Dialog onCreateDialog(int id) {
  39. switch (id) {
  40. case DIALOG_DOWNLOAD_PROGRESS:
  41. mProgressDialog = new ProgressDialog(this);
  42. mProgressDialog.setMessage("Downloading file..");
  43. mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  44. mProgressDialog.setCancelable(false);
  45. mProgressDialog.show();
  46. return mProgressDialog;
  47. default:
  48. return null;
  49. }
  50. }
  51. class DownloadFileAsync extends AsyncTask< String, String, String> {
  52. @Override
  53. protected void onPreExecute() {
  54. super.onPreExecute();
  55. showDialog(DIALOG_DOWNLOAD_PROGRESS);
  56. }
  57. @Override
  58. protected String doInBackground(String... aurl) {
  59. int count;
  60. try {
  61. URL url = new URL(aurl[0]);
  62. URLConnection conexion = url.openConnection();
  63. conexion.connect();
  64. int lenghtOfFile = conexion.getContentLength();
  65. Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
  66. InputStream input = new BufferedInputStream(url.openStream());
  67. OutputStream output = new FileOutputStream("/sdcard/picture.jpg");
  68. byte data[] = new byte[1024];
  69. long total = 0;
  70. while ((count = input.read(data)) != -1) {
  71. total += count;
  72. publishProgress(""+(int)((total*100)/lenghtOfFile));
  73. output.write(data, 0, count);
  74. }
  75. output.flush();
  76. output.close();
  77. input.close();
  78. } catch (Exception e) {
  79. Log.e("error",e.getMessage().toString());
  80. System.out.println(e.getMessage().toString());
  81. }
  82. return null;
  83. }
  84. protected void onProgressUpdate(String... progress) {
  85. Log.d("ANDRO_ASYNC",progress[0]);
  86. mProgressDialog.setProgress(Integer.parseInt(progress[0]));
  87. }
  88. @Override
  89. protected void onPostExecute(String unused) {
  90. dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
  91. }
  92. }
  93. }
复制代码

注意这里,在startdownload 方法中,调用了DownloadFileAsync内部类,这个内部类充分利用了AsyncTask的异步工作特性,是很方便的,onProgressUpdate是让进度条完成后消失。最后,要记得在androidmanifest.xml中的< /application>后加入< uses-permission android:name="android.permission.INTERNET" />让能有访问互联网的能力.

相关内容