Android 文件下载示例:使用 AsyncTask 和 Progress Dialog

本示例演示了如何在 Android 应用中使用 AsyncTaskProgressDialog 实现文件下载功能。代码中包含详细注释,帮助您理解每个步骤。

主要代码:

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();
            
        }
    }
}

使用说明:

  1. 确保已添加必要的权限:
<uses-permission android:name='android.permission.INTERNET' />
<uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' />
  1. fileUrlfileName 替换为您的实际下载链接和文件名。

  2. 运行代码,点击下载按钮,即可开始下载文件。

代码解释:

  1. 使用 AsyncTask 在后台执行下载任务,避免阻塞主线程。
  2. 使用 ProgressDialog 显示下载进度,提升用户体验。
  3. 使用 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();
    }
}

修改后的下载逻辑:

  1. 使用 OkHttp 库进行网络请求。
  2. 使用 JsonParser 解析返回的 JSON 数据。
  3. 获取图片地址并下载到本地文件。
  4. 使用 SnackbarToast 显示下载结果。

注意:

该示例使用 SnackbarToast 显示下载结果,您也可以使用其他方式,例如 AlertDialog

最终实现的效果:

当用户点击下载按钮时,应用会开始下载文件。下载过程中会显示一个 ProgressDialog,展示下载进度。下载完成后,会使用 ToastSnackbar 显示下载结果。

总结:

本示例提供了一个基本的 Android 文件下载示例,您可以根据实际需求进行修改和扩展。

Android 文件下载示例:使用 AsyncTask 和 Progress Dialog

原文地址: http://www.cveoy.top/t/topic/cwah 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录