Android 为什么我的AsyncTask文件下载在尝试下载大文件时失败?

Android 为什么我的AsyncTask文件下载在尝试下载大文件时失败?,android,Android,我正在尝试使用异步任务下载一个600 MB的文件。如果我在真实世界的设备上执行代码,它会工作,但前提是我“密切关注”屏幕,不允许屏幕关闭任何时间,但是,如果我不这样做,只让设备自己运行,几分钟后我去检查它,“进度”对话框消失,它下载的文件仅为其应有大小的一小部分。我猜这与手机在屏幕关闭一段时间后让WiFi进入睡眠状态有关 我该如何解决这个问题 以下是相关代码: class DownloadFileAsync extends AsyncTask<String, String, String&

我正在尝试使用异步任务下载一个600 MB的文件。如果我在真实世界的设备上执行代码,它会工作,但前提是我“密切关注”屏幕,不允许屏幕关闭任何时间,但是,如果我不这样做,只让设备自己运行,几分钟后我去检查它,“进度”对话框消失,它下载的文件仅为其应有大小的一小部分。我猜这与手机在屏幕关闭一段时间后让WiFi进入睡眠状态有关

我该如何解决这个问题

以下是相关代码:

class DownloadFileAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... aurl) {
        int count;

        try {
            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();

            int lenghtOfFile = conexion.getContentLength();


            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/file.zip");

            byte data[] = new byte[1024];

            long total = 0;

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

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

    }
    protected void onProgressUpdate(String... progress) {

         mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }
}
} 
class DownloadFileAsync扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
showDialog(对话框下载进度);
}
@凌驾
受保护的字符串背景(字符串…aurl){
整数计数;
试一试{
URL=新URL(aurl[0]);
URLConnection conexion=url.openConnection();
conexion.connect();
int lenghtOfFile=conexion.getContentLength();
InputStream输入=新的BufferedInputStream(url.openStream());
OutputStream output=新文件OutputStream(“/sdcard/file.zip”);
字节数据[]=新字节[1024];
长总计=0;
而((计数=输入。读取(数据))!=-1){
总数+=计数;
出版进度(“+(int)((总计*100)/长度文档));
输出.写入(数据,0,计数);
}
output.flush();
output.close();
input.close();
}捕获(例外e){}
返回null;
}
受保护的void onProgressUpdate(字符串…进度){
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@凌驾
受保护的void onPostExecute(字符串未使用){
dismissDialog(对话框下载进度);
}
}
} 

问题描述了如何保持屏幕打开,使手机不会进入睡眠状态。如果你试图下载文件600 Mb+,你可能会考虑把你的应用程序变成某种类型的,因为这可能需要几个小时。p> 问题描述了如何打开屏幕,使手机不会进入睡眠状态。如果你试图下载文件600 Mb+,你可能会考虑把你的应用程序变成某种类型的,因为这可能需要几个小时。p> 如果您的目标SDK足够高,您也可以使用。

如果您的目标SDK足够高,您也可以使用。

最有可能的情况是您使用的是Wi-Fi连接,一旦屏幕关闭,就可以断开连接。您可以签入:

  • 设置->无线和网络->Wi-Fi设置
  • 单击,选择
    Advanced
  • 单击“Wi-Fi睡眠策略”并选择“从不”

  • <>但是你应该考虑使用新的设备(Android 2.3 +)。

    最有可能的是你使用的是Wi-Fi连接,一旦屏幕关闭,就可以断开连接。您可以签入:

  • 设置->无线和网络->Wi-Fi设置
  • 单击,选择
    Advanced
  • 单击“Wi-Fi睡眠策略”并选择“从不”

  • <>但是你应该考虑使用新设备(Android 2.3 +)。

    尝试坚持现有的实现。downloadManager的存在就是为您轻松地完成这样的工作:API级别太高,需要更多的向后兼容性。。。不过还是要谢谢你!尝试使用现有的实现。downloadManager的存在就是为您轻松地完成这样的工作:API级别太高,需要更多的向后兼容性。。。不过还是要谢谢你!API级别太高,需要更多向后兼容性。。。不过还是要谢谢你!API级别太高,需要更多向后兼容性。。。不过还是要谢谢你!