我正在制作一个应用程序,该应用程序下载约231张图像,其中有150张显示在列表视图中,其余的则在单独的活动中在图像视图中显示为完整尺寸。 第一次运行该应用程序时,下载图像大约需要4分钟或5分钟(我需要一个进度条以显示总共下载了多少张照片),然后在下载图像后将其保存到sd卡。 然后,该应用程序的连续启动将从SD卡加载图像,而不是重新下载它们。

  1. 这是解决此问题的最佳方法吗?
  2. 如何制作进度条? 我只能成功制作适用于一张图像的进度条

===============>>#1 票数:1

我知道做到这一点的最好方法是使用asynctask。 因为它将允许您执行一些后台工作并同时更新UI(在您的情况下为进度栏)。

这是我将如何执行此操作的示例代码。

ProgressDialog mProgressDialog = new ProgressDialog(YourActivity.this);
mProgressDialog.setMessage("A message");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute("the url to the file you want to download");

这是AsyncTask外观的一个示例。

private class DownloadFile extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... url) {
    int count;
 try {
        URL url = new URL(url[0]);
        URLConnection conexion = url.openConnection();
        conexion.connect();
        // this will be useful so that you can show a tipical 0-100% progress bar
        int lenghtOfFile = conexion.getContentLength();

        // download the file
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream("/sdcard/somewhere/nameofthefile.ext");
   byte data[] = new byte[1024];

        long total = 0;
  while ((count = input.read(data)) != -1) {
            total += count;
            // publishing the progress....
            publishProgress((int)(total*100/lenghtOfFile));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();
    } catch (Exception e) {}
    return null;
}

上面的方法始终在后台运行,您不应该从那里更新任何UI。 另一方面,onProgressUpdate在UI线程上运行,因此您将在其中更改进度栏:

@Override
public void onProgressUpdate(String... args){
    // here you will have to update the progressbar
    // with something like
    mProgressDialog.setProgress(args[0]);
}
}

如果要在文件完全下载后执行一些代码,则还需要覆盖onPostExecute方法。

  ask by Vokara1228 translate from so

未解决问题?本站智能推荐: