我有一个应用程序可以下载大约6mb
的视频文件我正在尝试在Blackberry Curve 9360上运行此应用程序,它拥有32mb的“媒体”存储空间
有时这个应用程序运行并且能够毫无问题地下载视频,但是其他时候通过下载下载过程的一部分失败,IO异常表明:“文件系统上没有足够的可用内存来完成此操作行动“
以这种方式失败后,我可以打开BlackBerry Desktop软件并检查文件部分,看看该设备确实报告32/32 mb已满。
如果我再使用alt-shift-del重启设备并再次打开黑莓桌面软件,则已用空间缩小至仅5-6 / 32mb
有时在这一点上,我现在可以运行我的应用程序并让它成功下载,但有时它再次给了我相同的存储完整错误。我唯一可以注意到的事情似乎是它可能影响它是否失败是下载总共需要多长时间(即它在wifi上成功,在3g信号上有效并在较差的3g信号上失败,但这是最好的轶事)
我在几个不同的黑莓设备上使用了这个完全相同的应用程序,包括一些具有相同存储大小的其他曲线设备,并且之前从未遇到过这个问题。
我的问题是:有没有人看到BlackBerry曲线设备的行为方式会报告错误的存储空间,而这些存储空间会被重新启动修复?
这个下载代码有什么可能导致这种行为吗?
class DownloadThread extends Thread {
public void run()
{
HttpConnection httpConn = null;
InputStream is = null;
try{
httpConn = (HttpConnection)Connector.open(videoUrl + ";interface=wifi");
is = httpConn.openInputStream();
}catch(IOException e){
try{
httpConn = (HttpConnection)Connector.open(videoUrl);
is = httpConn.openInputStream();
}catch(IOException ioe){
System.out.println("891: "+e.toString());
}
}
try{
if (!videoFconn.exists())
videoFconn.create();
else{
videoFconn.delete();
videoFconn.create();
}
OutputStream os = videoFconn.openOutputStream();
lengthOfWebFile = httpConn.getLength();
total = 0;
System.out.println("##################### length of web file = " + lengthOfWebFile + " #################");
byte data[] = new byte[256];
while ((count = is.read(data)) != -1) {
total += count;
progress = (int)(total*100/lengthOfWebFile);
if(model.getValue() < progress){
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
EmbeddedMediaScreen.this.model.setValue(progress);
}
});
}
//write this chunk
os.write(data, 0, count);
Thread.yield();
}
os.flush();
os.close();
is.close();
httpConn.close();
lengthOfLocalFile = videoFconn.fileSize();
System.out.println("###################### Local Length = " + lengthOfLocalFile + "#####################");
if(lengthOfLocalFile == lengthOfWebFile){
amDownloading = false;
startVideo();
}else{
downloadVideo();
}
}catch(FileNotFoundException fnf){
}catch(IOException e){
//ScreenSaverActivity.errorDialog("975: "+e.toString());
System.out.println("980: "+e.toString());
//e.printStackTrace();
}catch(NullPointerException npe){
System.out.println("983: "+npe.toString());
} /*catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}*/
}
public synchronized void postProgress(final int p){
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
//Set the progress bar
EmbeddedMediaScreen.this.model.setValue(p);
}
});
}
}