展会信息港展会大全

Android怎样在下载文件同时显示一个进度条
来源:互联网   发布日期:2015-09-28 16:19:27   浏览:1746次  

导读:这里介绍下如何用Android模拟器去创建一个sdcard,并且学习在Android中去下载一个网上的文件保存到sdcard中,同时在Android下载文件的时候会显示一个进度条。这些就是我们这一篇代码要实现的内容。1:页面结构,......

这里介绍下如何用Android模拟器去创建一个sdcard,并且学习在Android中去下载一个网上的文件保存到sdcard中,同时在Android下载文件的时候会显示一个进度条。这些就是我们这一篇代码要实现的内容。

1:页面结构,提供一个button,点击BUTTON,去下载一个图片,main.xml设计如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?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:id="@+id/startBtn"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Start long running task.."

/>

</LinearLayout>

2:主程序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

package android.study;

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://www.android-study.com/image/logo.gif";

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 = newFileOutputStream("/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);

}

}

}

</string,>

注意这里,在startdownload方法中,调用了DownloadFileAsync内部类,这个内部类充分利用了AsyncTask的异步工作特性,是很方便的,onProgressUpdate是让进度条完成后消失。

最后,要记得在androidmanifest.xml中的</application>后加入:

1

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

让应用有访问互联网权限。

3:下面讲解下其中用到的,把图片保存到sdcard中去,由于是模拟器,因此只能在磁盘上模拟一个IMG文件来模拟,步骤如下:

1) 打开cmd,进入Android SDK安装路径下的tools目录下,输入如下命令:

mksdcard 1024M sdcard.img

该命令会在当前目录下生成一个sdcard.img文件,该文件是Android模拟器的SD卡镜像文件。1024M表示SD卡有1024M大小,即1G容量。目前Android支持8M~128G的SD卡。

2) 运行带sdcard的模拟器

A 在cmd中启动带有sdcard的模拟器

进入Android SDK安装路径下的tools目录中,运行下面命令:

emulator -avd name_avd -sdcard sdcard.img

其中,name_avd是已有的模拟器的名字,sdcard.img是第一步创建的SD卡镜像文件。

B 在eclipse中,新建模拟器的时候,指定SD卡镜像文件的路径,并且加入对SD卡的支持选项

打开eclipse,进入:window->android SDK and AVD manager,然后在create avd的时候,在SD CARD中选择"FILE",然后再选择sd support;

3)如何看SDCARD中的文件

1)在cmd中,进入Android SDK的安装路径下的tools目录中,运行命令:

adb push E:\abc.jpg sdcard/abc.jpg

其中,E:\abc.jpg 是本地要上传的文件,sdcard/abc.jpg 为上传到SD卡中的路径。

注意:adb push 电脑路径 模拟器路径

在电脑路径中,必须使用,在模拟器路径中必须使用 / ,并且模拟器的根路径是只读的。

2 ) 在eclipse环境中

在设置了RUN的命令参数后,RUN一个应用程序,然后使用DDMS的File Explorer工具导入导出文件。打开DDMS工具,在eclipse的windows->Open Perspective->Other...里面打开DDMS工具,在DDMS工具的File Explorer标签里面选择sdcard目录导入导出文件。

赞助本站

人工智能实验室

相关热词: Android 下载文件 进度条

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港