2011-12-08 75 views
1

我有一個從在線下載文件的黑莓應用程序。有時候下載會成功,有時會下載失敗。它似乎只是Curve 9360設備上的一個問題。當出現故障時,在設備上它關閉我的應用程序,並顯示一個彈出,說BlackBerry下載文件

「未捕獲exeption應用[MyApp的]沒有響應;處理 終止」

這是同時循環,這是當它失敗的:

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 
. 
. 

有沒有人跑過這樣的事情,同時親從語法上下載黑莓設備上的文件?

任何人都可以在我的IO循環中看到任何會導致此類崩潰的東西嗎?

最後有人知道是否有某種方式可以得到任何異常被拋出的實際堆棧跟蹤?

+0

檢查事件日誌以查看是否有與您的應用程序相關的內容。 ALT + LGLG – rfsk2010

+0

裏面檢查,發現引用我的應用程序的東西。當選擇它時,唯一給出的信息是名稱,嚴重性,guid,時間戳和「AMFD [myAppname](323) – FoamyGuy

回答

1

嘗試在os.write()之後加入Thread.yield()。這會讓其他線程有機會運行,並且應該阻止你的應用被JVM殺死。

+0

我有睡眠時間的重要性是多少?我按照你的建議設置了睡眠(100),但是這會導致下載花費很長時間,因爲它正在爲文件中的每個1024字節睡眠1/10秒。如果我將它設置爲像10或5這樣的更低的值,它會在防止jvm殺死我的過程中產生同樣的效果嗎? – FoamyGuy

+0

我已經去了Thread.sleep(10);它似乎到目前爲止工作[*敲他的木桌*]如果我通過了一些更多的測試,一切都很好,我會接受你的答案。並感謝TON幫助我。 – FoamyGuy

+0

沒問題提姆,只要你睡了一段時間,讓其他線程有機會執行,在睡眠中指定的時間並不重要。 – donturner

2

要打印堆棧跟蹤,您必須捕獲throwable而不是異常。我的結論是基於以下

RIM實現注意 只有捕獲的異常已經堆棧跟蹤給予RIM音符。虛擬機檢查當前的捕獲堆棧,如果它發現任何可以捕獲異常的東西,它將消除堆棧跟蹤以節省時間和內存。當前堆棧中的任何代碼(例如catch(Exception e))都會消除堆棧跟蹤。 如果從未捕獲到異常,則會生成堆棧跟蹤。如果存在catch(Throwable t)等代碼,也會生成堆棧跟蹤。

而且

你得到,如果while循環不結束,循環在Runnable對象在事件線程不斷地把消息「結束進程」。嘗試擺脫invokeLater(),看看你的過程是否仍然被終止。

+0

現在就測試它如果我擺脫invokeLater()如何更新進度條屏幕,因爲我的下載發生在不同的線程? – FoamyGuy

+0

這將幫助你。http://stackoverflow.com/questions/4376140/blackberry-uncaught-exception-application-is-not-responding-process-terminat – rfsk2010

+0

答案在那個線程說使用.invokeLater()... – FoamyGuy