我开始创建文件下载器类。这就是我所拥有的:
public class Downloader {
//download url
URL url;
public Downloader(URL downloadURL){
url = downloadURL;
}
public void toFile(File fName) {
try {
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
FileOutputStream fileOutput = new FileOutputStream(fName);
InputStream inputStream = urlConnection.getInputStream();
byte[] buffer = new byte[1024];
int bufferLength = 0;
while ((bufferLength = inputStream.read(buffer)) > 0) {
fileOutput.write(buffer, 0, bufferLength);
}
fileOutput.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我需要在新线程中调用此下载程序。也许有人可以给我提示为什么我需要为此调用新线程或asyc任务。
public void downloadFile(String urlToDownload,String path) throws MalformedURLException{
new Thread(new Runnable() {
public void run() {
new Downloader(new URL(urlToDownload)).toFile(new File(path));
}
}).start();
}
因此,当我想下载我的文件时,它会异步下载。
我真的不想那样。 我想创建下载器,我可以选择是否要同步或异步下载文件。
但首先,我想知道何时下载文件。我怎么知道这个?
也许有人这样做了,可以帮助我。 我需要知道何时下载文件。
感谢。
答案 0 :(得分:4)
答案 1 :(得分:2)
在调用start()后,在线程启动时启动。为方便起见,通常使用类似matemink解决方案的Asyntask:
+方法doInBackground()将在工作线程中运行
+方法onPostExecute(0将运行以更新UI线程
关注您:
我需要在新线程中调用此下载程序。也许有人可以给 我暗示为什么我需要为此
调用新线程或asyc任务
<强>答案强>: 您需要在单独的线程或Asyntask中下载以避免ANR对话̣(如果您需要下载大文件或者您的网络连接速度很慢,它可能会导致主UI线程中出现ANR对话框),这就是为什么您需要在工作者中放置高工作负载的工具线程而不是主UI线程:
参考: http://developer.android.com/guide/practices/design/responsiveness.html
答案 2 :(得分:0)
使用Handler
了解您的文件何时下载。
答案 3 :(得分:0)
仍然使用AsyncTask,并使用onProgressUpdate方法。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
答案 4 :(得分:0)
是的,您无法在主线程中执行网络操作。 您可以查看此存储库以下载文件。 AndroidFileDownloaderModule