這裡小結下,如何用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;
- @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" />讓能有通路網際網路的能力.