Android 文件下载示例:使用 AsyncTask 和 Progress Dialog
Android 文件下载示例:使用 AsyncTask 和 Progress Dialog
本示例演示了如何在 Android 应用中使用 AsyncTask 和 ProgressDialog 实现文件下载功能。代码中包含详细注释,帮助您理解每个步骤。
主要代码:
public class MainActivity extends AppCompatActivity {
private Button downloadButton;
private ProgressDialog progressDialog;
private String fileUrl = 'imageUrl'; // 文件下载链接
private String fileName = 'inputText'; // 下载的文件名
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
downloadButton = findViewById(R.id.download_button);
downloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DownloadFile().execute(fileUrl);
}
});
}
private class DownloadFile extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage('正在下载文件...');
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected String doInBackground(String... strings) {
int count;
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
// 获取文件长度
int fileLength = connection.getContentLength();
// 创建输入流和输出流
InputStream input = new BufferedInputStream(url.openStream(),
8192);
FileOutputStream output = new FileOutputStream(
Environment.getExternalStorageDirectory().toString() + '/' + fileName);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
Log.e('Error: ', e.getMessage());
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
progressDialog.setIndeterminate(false);
progressDialog.setMax(100);
progressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String file_url) {
progressDialog.dismiss();
}
}
}
使用说明:
- 确保已添加必要的权限:
<uses-permission android:name='android.permission.INTERNET' />
<uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' />
-
将
fileUrl和fileName替换为您的实际下载链接和文件名。 -
运行代码,点击下载按钮,即可开始下载文件。
代码解释:
- 使用
AsyncTask在后台执行下载任务,避免阻塞主线程。 - 使用
ProgressDialog显示下载进度,提升用户体验。 - 使用
HttpURLConnection获取网络数据,并使用FileOutputStream将数据写入本地文件。
其他:
您也可以使用其他的网络库,例如 OkHttp,来实现下载功能。
代码示例:
public void dow_imgone(final View view) {
new AsyncTask<Void, Void, String>() {
protected String doInBackground(Void... voids) {
OkHttpClient client = new OkHttpClient();
EditText editText = findViewById(R.id.edit_text);
String inputText = editText.getText().toString();
if (inputText.isEmpty()) {
Snackbar.make(view, '输入框为空', Snackbar.LENGTH_LONG)
.setAction('Action', null).show();
return '输入框为空';
}
String url = 'https://app.huashijie.art/api/work/detailV2?visitorId=-1&workId=' + inputText + '&cur_user_id=-1&platform=android&os_version=28&version_code=217&device_brand=vivo&device_model=vivo%20X21&token=&channel=vivo';
Request request = new Request.Builder()
.url(url)
.build();
try {
Response response = client.newCall(request).execute();
String responseBody = response.body().string();
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(responseBody).getAsJsonObject();
String imageUrl = json.get('data').getAsJsonObject().get('multiImages').getAsJsonArray().get(0).getAsJsonObject().get('imgPath').getAsString();
if (imageUrl != null) {
String fileName = 'image.jpg';
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File outputFile = new File(downloadDir, fileName);
downloadImage(imageUrl, outputFile);
return '获取链接成功' + imageUrl + '文件将保存到:' + downloadDir;
} else {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText('imageUrl', imageUrl);
clipboard.setPrimaryClip(clip);
return '未能提取到图片地址' + imageUrl;
}
} catch (IOException e) {
e.printStackTrace();
return '下载失败';
}
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
}.execute();
}
private void downloadImage(String imageUrl, File outputFile) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(imageUrl)
.build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(response.body().bytes());
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
修改后的下载逻辑:
- 使用
OkHttp库进行网络请求。 - 使用
JsonParser解析返回的 JSON 数据。 - 获取图片地址并下载到本地文件。
- 使用
Snackbar和Toast显示下载结果。
注意:
该示例使用 Snackbar 和 Toast 显示下载结果,您也可以使用其他方式,例如 AlertDialog。
最终实现的效果:
当用户点击下载按钮时,应用会开始下载文件。下载过程中会显示一个 ProgressDialog,展示下载进度。下载完成后,会使用 Toast 或 Snackbar 显示下载结果。
总结:
本示例提供了一个基本的 Android 文件下载示例,您可以根据实际需求进行修改和扩展。
原文地址: http://www.cveoy.top/t/topic/cwah 著作权归作者所有。请勿转载和采集!