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

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

Java代码:

< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > < TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> < Button android:text="Start long running task.." android:id="@+id/startBtn" android:layout_width="fill_parent" android:layout_height="wrap_content"> < /Button> < /LinearLayout>

复制代码


       2 主程序

Java代码:

package eoe.liao; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class AndroAsync extends Activity { public static final int DIALOG_DOWNLOAD_PROGRESS = 0; private Button startBtn; private ProgressDialog mProgressDialog; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startBtn = (Button)findViewById(R.id.startBtn); startBtn.setOnClickListener(new OnClickListener(){ public void onClick(View v) { startDownload(); } }); } private void startDownload() { String url = "http://image-7.verycd.com/0d7596f5db7df1742236466dc91311b1435702(120x120)/thumb.jpg"; new DownloadFileAsync().execute(url); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_DOWNLOAD_PROGRESS: mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Downloading file.."); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(false); mProgressDialog.show(); return mProgressDialog; default: return null; } } class DownloadFileAsync extends AsyncTask< String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); showDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override protected String doInBackground(String... aurl) { int count; try { URL url = new URL(aurl[0]); URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength(); Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream("/sdcard/picture.jpg"); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress(""+(int)((total*100)/lenghtOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { Log.e("error",e.getMessage().toString()); System.out.println(e.getMessage().toString()); } return null; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC",progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(String unused) { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); } } }

复制代码

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdgjw.html