gpt4 book ai didi

android - 下载安卓大文件

转载 作者:太空狗 更新时间:2023-10-29 15:37:24 27 4
gpt4 key购买 nike

当我尝试此代码时,它开始下载,但随后出现“强制关闭”警报我应该怎么办?使用某种后台线程?

try {
long startTime = System.currentTimeMillis();

URL u = new URL("http://file.podfm.ru/3/33/332/3322/mp3/24785.mp3");
HttpURLConnection c = (HttpURLConnection) u.openConnection();

c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = new FileOutputStream(new File("/sdcard/","logo.mp3"));

InputStream in = c.getInputStream();

byte[] buffer = new byte[1024];
int len1 = 0;
while ( (len1 = in.read(buffer)) != -1 ) {
f.write(buffer,0, len1);
}
f.close();

Log.d("ImageManager", "download ready in" +
((System.currentTimeMillis() - startTime) / 1000) + " sec");
}
catch (IOException e)
{
Log.d("ImageManager", "Error" +
((System.currentTimeMillis()) / 1000) + e + " sec");
}

最佳答案

上周我正在处理类似的问题,最后使用了 AsyncTask显示进度条,因为下载文件可能需要一些时间。一种方法是将下面的类嵌套在您的 Activity 中,然后在您需要的地方简单地调用它:

new DownloadManager().execute("here be URL", "here be filename");

或者如果类不在 Activity 中并且从 Activity 中调用..

new DownloadManager(this).execute("URL", "filename");

这会传递 Activity ,因此我们可以访问方法 getSystemService();

这是执行所有脏工作的实际代码。您可能必须根据需要修改它。

private class DownloadManager extends AsyncTask<String, Integer, Drawable>
{

private Drawable d;
private HttpURLConnection conn;
private InputStream stream; //to read
private ByteArrayOutputStream out; //to write
private Context mCtx;

private double fileSize;
private double downloaded; // number of bytes downloaded
private int status = DOWNLOADING; //status of current process

private ProgressDialog progressDialog;

private static final int MAX_BUFFER_SIZE = 1024; //1kb
private static final int DOWNLOADING = 0;
private static final int COMPLETE = 1;

public DownloadManager(Context ctx)
{
d = null;
conn = null;
fileSize = 0;
downloaded = 0;
status = DOWNLOADING;
mCtx = ctx;
}

public boolean isOnline()
{
try
{
ConnectivityManager cm = (ConnectivityManager)mCtx.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo().isConnectedOrConnecting();
}
catch (Exception e)
{
return false;
}
}

@Override
protected Drawable doInBackground(String... url)
{
try
{
String filename = url[1];
if (isOnline())
{
conn = (HttpURLConnection) new URL(url[0]).openConnection();
fileSize = conn.getContentLength();
out = new ByteArrayOutputStream((int)fileSize);
conn.connect();

stream = conn.getInputStream();
// loop with step
while (status == DOWNLOADING)
{
byte buffer[];

if (fileSize - downloaded > MAX_BUFFER_SIZE)
{
buffer = new byte[MAX_BUFFER_SIZE];
}
else
{
buffer = new byte[(int) (fileSize - downloaded)];
}
int read = stream.read(buffer);

if (read == -1)
{
publishProgress(100);
break;
}
// writing to buffer
out.write(buffer, 0, read);
downloaded += read;
// update progress bar
publishProgress((int) ((downloaded / fileSize) * 100));
} // end of while

if (status == DOWNLOADING)
{
status = COMPLETE;
}
try
{
FileOutputStream fos = new FileOutputStream(filename);
fos.write(out.toByteArray());
fos.close();
}
catch ( IOException e )
{
e.printStackTrace();
return null;
}

d = Drawable.createFromStream((InputStream) new ByteArrayInputStream(out.toByteArray()), "filename");
return d;
} // end of if isOnline
else
{
return null;
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
}// end of catch
} // end of class DownloadManager()

@Override
protected void onProgressUpdate(Integer... changed)
{
progressDialog.setProgress(changed[0]);
}

@Override
protected void onPreExecute()
{
progressDialog = new ProgressDialog(/*ShowContent.this*/); // your activity
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Downloading ...");
progressDialog.setCancelable(false);
progressDialog.show();
}

@Override
protected void onPostExecute(Drawable result)
{
progressDialog.dismiss();
// do something
}
}

关于android - 下载安卓大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com