Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 下载大视频文件时内存不足错误_Android_Download_Out Of Memory_Intentservice - Fatal编程技术网

Android 下载大视频文件时内存不足错误

Android 下载大视频文件时内存不足错误,android,download,out-of-memory,intentservice,Android,Download,Out Of Memory,Intentservice,我使用intent service下载了一组视频文件,但在下载一些大尺寸视频时,它在“byte[]responseBody=client.execute(getMethod,responseHandler);”部分中出现内存不足错误,我知道字节数组超出了为应用程序分配的堆大小 我正在寻找一些替代解决方案,以克服这个问题,请建议我,如果你有一些好的解决办法 @Override public void onHandleIntent(Intent i) { Log.d(

我使用intent service下载了一组视频文件,但在下载一些大尺寸视频时,它在“byte[]responseBody=client.execute(getMethod,responseHandler);”部分中出现内存不足错误,我知道字节数组超出了为应用程序分配的堆大小

我正在寻找一些替代解决方案,以克服这个问题,请建议我,如果你有一些好的解决办法

    @Override
    public void onHandleIntent(Intent i) {
        Log.d("gl", "onhandleintent");
        HttpGet getMethod = new HttpGet(i.getData().toString());
        int result = Activity.RESULT_CANCELED;
        ad_id =i.getStringExtra("ad_id");

        try {
            ResponseHandler<byte[]> responseHandler = new ByteArrayResponseHandler();
            byte[] responseBody = client.execute(getMethod, responseHandler);
            Log.d("gl", "file name " + i.getData().getLastPathSegment());
            File output = new File(SharedPreferenceClass.readName(
                    Downloader.this, "videoFolder", "itaxi-videos"), i
                    .getData().getLastPathSegment());

            if (output.exists()) {
                output.delete();
            }

            FileOutputStream fos = new FileOutputStream(output.getPath());

            fos.write(responseBody);
            fos.close();
            result = Activity.RESULT_OK;
        } catch (IOException e2) {
            Log.e(getClass().getName(), "Exception in download", e2);
            result = Activity.RESULT_CANCELED;
        }

        Bundle extras = i.getExtras();

        // sending back datas to the handle for further updations like db
        if (extras != null) {
            Messenger messenger = (Messenger) extras.get(EXTRA_MESSENGER);
            Message msg = Message.obtain();
            msg.arg1 = result;
            try {
                Bundle bundle = new Bundle();
                bundle.putString("ad_id", ad_id);
                msg.setData(bundle);
                messenger.send(msg);
            } catch (android.os.RemoteException e1) {
                Log.w(getClass().getName(), "Exception sending message", e1);
            }
        }
    }
@覆盖
处理内容上的公共无效(意图一){
日志d(“gl”、“onhandleintent”);
HttpGet getMethod=newhttpget(i.getData().toString());
int result=Activity.result\u已取消;
ad_id=i.getStringExtra(“ad_id”);
试一试{
ResponseHandler ResponseHandler=新的ByteArrayResponseHandler();
字节[]responseBody=client.execute(getMethod,responseHandler);
Log.d(“gl”,“文件名”+i.getData().getLastPathSegment());
文件输出=新文件(SharedPreferenceClass.readName(
Downloader.this,“视频文件夹”,“itaxi视频”),我
.getData().getLastPathSegment());
if(output.exists()){
output.delete();
}
FileOutputStream fos=新的FileOutputStream(output.getPath());
fos.编写(应答本);
fos.close();
结果=活动。结果\u正常;
}捕获(IOE2异常){
Log.e(getClass().getName(),“下载中的异常”,e2);
结果=活动。结果\u已取消;
}
Bundle extras=i.getExtras();
//将数据发送回句柄以进行进一步更新,如db
如果(附加值!=null){
Messenger=(Messenger)额外获取(额外Messenger);
Message msg=Message.get();
msg.arg1=结果;
试一试{
Bundle=新Bundle();
bundle.putString(“ad_id”,ad_id);
msg.setData(bundle);
messenger.send(msg);
}捕获(android.os.RemoteException e1){
Log.w(getClass().getName(),“异常发送消息”,e1);
}
}
}

提前感谢

问题在于:您使用的是一个
响应句柄
,它只需将整个HTTP响应读取到内存中的一个字节数组中。你没有那么多的记忆力

您需要获取底层的
InputStream
并循环,从流中读取合理数量的数据,然后写入输出文件

InputStream
位于从
HttpResponse

您可以:

A) 编写一个定制的
ResponseHandler
,将
文件传递给它的构造函数,它将完成所有工作


B) 只需调用
client.execute(getMethod)
。这将直接返回
HttpResponse

在写入磁盘之前,不要将整个响应存储在内存中。问题解决了。