我有一个从网上下载文件的黑莓应用程序。有时候下载成功,有时候它会在中间的某个地方失败。它似乎只是Curve 9360设备上的一个问题。当它失败时,在设备上关闭我的应用程序并显示一个说
的弹出窗口“未捕获的exeption应用程序[MyApp]没有响应;进程 封端的“
这是失败时的while循环:
byte data[] = new byte[1024];
try {
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);
}
} catch (Exception e) {
e.printStackTrace();
}
发生这种情况时,控制台中没有任何类型的堆栈跟踪。我得到以下内容:
[710.328] Application BBCurve9360DemoLoop(314) is not responding; process terminated
[710.328]
[710.429] [0 0]
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
.[lots more "0 2"s]
.
.
.
[710.429] 2 203
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
[710.429] 0 2
.[lots more "0 2"s
.
.
在Blackberry设备上以编程方式下载文件时,是否有人遇到过这样的事情?
任何人都可以在我的IO循环中看到任何可能导致此类崩溃的内容吗?
最后有人知道是否有某种程度上我可以获得任何异常抛出的实际堆栈跟踪?
答案 0 :(得分:2)
要打印堆栈跟踪,您必须捕获throwable而不是异常。我的结论是基于下面给出的RIM说明
RIM实施说明 只有未捕获的异常才有堆栈跟踪。 VM检查当前的catch堆栈,如果找到任何可以捕获异常的东西,它会消除堆栈跟踪以节省时间和内存。当前堆栈中的任何代码(例如catch(Exception e))都会消除堆栈跟踪。 如果从未捕获到异常,则生成堆栈跟踪。如果存在catch(Throwable t)等代码,也会生成堆栈跟踪。
另外
如果while循环没有结束并且循环不断地在事件线程中放入可运行的对象,则会收到“进程终止”消息。尝试摆脱invokeLater()并查看您的进程是否仍然被终止。
答案 1 :(得分:1)
尝试在Thread.yield()
之后添加os.write()
。这将为其他线程提供运行的机会,并且应该阻止您的应用程序被JVM杀死。