java下载文件且显示进度_使用Android下载文件,并在ProgressDialog中显示进度

我正在尝试编写一个易于更新的简单应用程序。 为此,我需要一个简单的函数,该函数可以下载文件并在ProgressDialog 显示当前进度 。 我知道如何执行ProgressDialog ,但是我不确定如何首先显示当前进度以及如何下载文件。

#1楼

是的,上面的代码可以工作。但是,如果您要在Asynctask onProgressUpdate中更新progressbar ,然后按返回按钮或完成活动,则AsyncTask与UI失去联系。当您返回活动时,即使正在运行下载,后台,您将不会在进度栏上看到任何更新。 因此,在OnResume()尝试使用计时器任务运行类似runOnUIThread的线程,该计时器任务使用从AsyncTask运行后台更新的值来更新progressbar 。

private void updateProgressBar(){

Runnable runnable = new updateProgress();

background = new Thread(runnable);

background.start();

}

public class updateProgress implements Runnable {

public void run() {

while(Thread.currentThread()==background)

//while (!Thread.currentThread().isInterrupted()) {

try {

Thread.sleep(1000);

Message msg = new Message();

progress = getProgressPercentage();

handler.sendMessage(msg);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

} catch (Exception e) {

}

}

}

private Handler handler = new Handler(){

@Override

public void handleMessage(Message msg) {

progress.setProgress(msg.what);

}

};

当您的活动不可见时,别忘了销毁线程。

private void destroyRunningThreads() {

if (background != null) {

background.interrupt();

background=null;

}

}

#2楼

我的个人建议是使用进度对话框并在执行之前进行构建,或者在OnPreExecute()处启动,如果您使用进度对话框的进度条的水平样式,则经常发布进度。 剩下的部分是优化doInBackground的算法。

#3楼

不要忘记用新文件 (“ / mnt / sdcard / ...”)替换“ / sdcard ...”,否则您将得到FileNotFoundException

#4楼

我建议您使用基于Volley的 Project Netroid 。 我添加了一些功能,例如多事件回调,文件下载管理。 这可能会有帮助。

#5楼

我发现此博客文章非常有帮助,它使用loopJ下载文件,它只有一个Simple函数,将对一些新的android有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
欢迎!以下是一个简单的Android下载文件的代码示例: 首先,在AndroidManifest.xml文件添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 然后,在Activity创建一个异步任务类来处理下载: ```java import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Environment; import android.util.Log; import android.widget.Toast; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class DownloadTask extends AsyncTask<String, Integer, String> { private ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setTitle("下载文件"); progressDialog.setMessage("正在下载,请稍候..."); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.show(); } @Override protected String doInBackground(String... params) { String fileUrl = params[0]; String savePath = Environment.getExternalStorageDirectory().getPath() + "/downloaded_file.jpg"; try { URL url = new URL(fileUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect(); int fileLength = connection.getContentLength(); InputStream inputStream = connection.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream(savePath); byte[] buffer = new byte[1024]; int bytesRead; long totalBytesRead = 0; while ((bytesRead = inputStream.read(buffer)) != -1) { totalBytesRead += bytesRead; publishProgress((int) ((totalBytesRead * 100) / fileLength)); fileOutputStream.write(buffer, 0, bytesRead); } fileOutputStream.close(); inputStream.close(); connection.disconnect(); } catch (Exception e) { Log.e("DownloadTask", e.getMessage()); return "下载失败"; } return "下载成功"; } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); progressDialog.setProgress(progress[0]); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); progressDialog.dismiss(); Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } } ``` 最后,在需要下载文件的地方调用AsyncTask执行下载任务: ```java String fileUrl = "http://example.com/file.jpg"; new DownloadTask().execute(fileUrl); ``` 以上代码实现了一个可以下载文件的简单Android应用。它使用了一个异步任务类来执行网络请求并将文件保存到设备的指定路径显示了一个进度对话框来显示下载进度,并在下载完成后显示一个Toast消息。请注意,这个示例仅供参考,实际应用可能需要进一步处理异常、权限检查等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值