您的位置:首页 > 移动开发 > Android开发

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

2011-06-15 10:15 656 查看
这里小结下,如何用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" />让能有访问互联网的能力.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: