2011-07-27 32 views
7

Tôi có một ứng dụng Blackberry mà khi chạy ở một số giả lập với sự hỗ trợ cảm ứng (ví dụ: 9500, 9520, 9530, 9550), chấm dứt với:BlackBerry: "Ứng dụng không phản hồi; quá trình chấm dứt" vì UiApplication.getUiApplication(). PopScreen()?

"Ứng dụng không được đáp ứng; quá trình XPTO chấm dứt"

Sử dụng các bản ghi, tôi phát hiện ra rằng nó có vẻ như ứng dụng được dừng lại trong một lớp học mà tôi không đồng bộ làm cho các yêu cầu HTTP: một cái gì đó như:

public class LoadingFullScreen extends FullScreen implements Runnable { 

    private Thread actionThread = null; 

    protected void onDisplay() { 
     actionThread = new Thread(this); 
     actionThread.start(); 
    } 

    protected void onUndisplay() { 
     if(actionThread != null && actionThread.isAlive()) { 
      actionThread.interrupt(); 
     } 
    } 

    public void run() { 
     //make http requests - this is done successfully 

     synchronized(Application.getEventLock()) { 
       Screen active = UiApplication.getUiApplication().getActiveScreen(); 
       if (active instanceof LoadingFullScreen) { 
        Logger.debug("LoadingFullScreen popping screen"); //this appears in logs 
        UiApplication.getUiApplication().popScreen(active); 
        Logger.debug("LoadingFullScreen screen popped"); //this never appears in logs 
       } 
     } 
    } 
} 

tôi khởi động màn hình này với UiApplication.getUiApplication().pushModalScreen(new LoadingFullScreen())

Trong các bản ghi tôi có thể thấy:

[0.0] Wed Jul 27 17:53:06 GMT 2011 - DEBUG: LoadingFullScreen popping screen 
[0.0] JVM: bklt[1] @163148: JBSC on=0 
[0.0] JVM: bklt[1] @163148: SC 0 
[0.0] JVM: bklt[1]: setTimeout 30 
[0.0] Application XPTO(212) is not responding; process terminated 

Nó có vẻ như UiApplication.getUiApplication().popScreen() đang chặn ứng dụng, và do đó các hệ điều hành tiêu diệt ứng dụng, nhưng tại sao?

EDIT:
Tôi cũng đã cố gắng sử dụng

UiApplication.getUiApplication().invokeLater(new Runnable() {...} };    

thay vì synchronized(Application.getEventLock()) {...} nhưng tôi có kết quả chính xác cùng

EDIT 2:
Tôi cũng đã cố gắng active.close() thay vì UiApplication.getUiApplication().popScreen(active); nhưng tôi có kết quả chính xác tương tự

EDIT 3: Sử dụng javaloader tôi đã loại stacktrace từ giả lập:

guid:0x9C3CD62E3320B498 time: Thu Jul 28 15:02:50 2011 severity:0 type:3 app:Java Exception data: 
    ForcedStackTraceException 
    net_rim_services_impl(4) 27 2 0x1030B000 
    net_rim_os-3(4BEF0320) 
    HttpConnectionManager$CleanupThread 
    run 
    0x3B09 
guid:0x9C3CD62E3320B498 time: Thu Jul 28 15:02:50 2011 severity:0 type:3 app:Java Exception data: 
    ForcedStackTraceException 
    XPTO(247) 60 4 0x124A0400 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    getFocusRect 
    0x2A61 
    net_rim_cldc-12(4BEEF8A5) 
    Manager 
    getFocusRect 
    0x717 
    net_rim_cldc-12(4BEEF8A5) 
    Manager 
    getFocusRect 
    0x717 
    net_rim_cldc-12(4BEEF8A5) 
    Screen 
    getFocusRect 
    0x9AF2 
    net_rim_cldc-12(4BEEF8A5) 
    Screen 
    callOnExposed 
    0x9D16 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    <private> 
    0x9007 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    removeScreen 
    0x7D08 
    net_rim_cldc-12(4BEEF8A5) 
    Screen 
    close 
    0x6B66 
    XPTO-8(4E316B06) 
    LoadingFullScreen$1 
    run 
    0x34D5 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    dispatchInvokeLater 
    0x1A87 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    <private> 
    0x2809 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    processNextMessage 
    0x1AEF 
    net_rim_cldc-9(4BEEF8A5) 
    ModalEventThread 
    run 
    0xBE4F 
guid:0x9C3CD62E3320B498 time: Thu Jul 28 15:02:50 2011 severity:0 type:3 app:Java Exception data: 
    ForcedStackTraceException 
    XPTO(247) 30 2 0x139DA800 
    net_rim_cldc(4BEEF8A5) 
    Object 
    wait 
    0x9922 
    net_rim_cldc-8(4BEEF8A5) 
    Application 
    startModalEventThread 
    0x1EB8 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    addScreenModal 
    0x83F4 
    net_rim_cldc-13(4BEEF8A5) 
    UiEngineImpl 
    pushModalScreen 
    0x674E 
    net_rim_cldc-13(4BEEF8A5) 
    UiApplication 
    pushModalScreen 
    0x62B0 
    XPTO-8(4E316B06) 
    MyBaseScreen 
    <private> 
    0x3AA6 
    XPTO-8(4E316B06) 
    MyBaseScreen 
    openTheModalScreenFunction 
    0x382C 
    XPTO-8(4E316B06) 
    MyBaseScreen$4 
    fieldChanged 
    0x4271 
    net_rim_cldc-11(4BEEF8A5) 
    Field 
    fieldChangeNotify 
    0x160B 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    replace 
    0x7A5 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    inputMethodTextChanged 
    0x24E1 
    net_rim_cldc-15(4BEEF8A5) 
    PasswordEditField 
    inputMethodTextChanged 
    0x4F26 
    net_rim_cldc-27(4BEEF8A5) 
    IMContext 
    dispatchInputMethodEvent 
    0x1E00 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    sendComposedText 
    0x5CA1 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    sendComposedText 
    0x5BD1 
    net_rim_tid_fastEuropean(4BEF034C) 
    FastEuropeanInputMethod 
    sendComposedText 
    0x48E1 
    net_rim_tid_fastEuropean(4BEF034C) 
    FastEuropeanInputMethod 
    dispatchConversionEvent 
    0x43E3 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    dispatchKeyEvent 
    0x5309 
    net_rim_tid-4(4BEEF8E1) 
    SLInputMethod 
    dispatchEvent 
    0x63CA 
    net_rim_tid_fastEuropean(4BEF034C) 
    FastEuropeanInputMethod 
    dispatchEvent 
    0x426E 
    net_rim_cldc-27(4BEEF8A5) 
    InputContext 
    dispatchEvent 
    0x3E15 
    net_rim_cldc-27(4BEEF8A5) 
    IMContext 
    dispatchEvent 
    0x21DE 
    net_rim_cldc-11(4BEEF8A5) 
    Field 
    dispatchEvent 
    0x3739 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    dispatchEvent 
    0x30F6 
    net_rim_cldc-27(4BEEF8A5) 
    EventHandler 
    <private> 
    0x1460 
    net_rim_cldc-27(4BEEF8A5) 
    EventHandler 
    processKeyEvent 
    0x1A79 
    net_rim_cldc-16(4BEEF8A5) 
    TextField 
    processKeyEvent 
    0x37F6 
    net_r 

EDIT 4: Tôi đã cố gắng để di chuyển các phương pháp run() trong LoadingFullScreen đến một lớp học mới Runnable, như Tôi được thông báo rằng có LoadingFullScreen implement Runnable có thể gây ra sự cố khi lớp đó được hiển thị dưới dạng màn hình phương thức.
Tuy nhiên, tôi không có may mắn và tôi vẫn gặp vấn đề tương tự.
Bất kỳ ý tưởng nào?

EDIT 5: Giải Quyết ở đây: BlackBerry: "Application is not responding; process terminated" because of UiApplication.getUiApplication().popScreen()?

+0

Bạn có sử dụng bất kỳ phần ghi đè nào trên "hoạt động" hay không. onClose()? –

+0

Hi Ray. Tôi đang ghi đè lênHiển thị và onUndisplay. Tôi đang chỉnh sửa bài đăng, thêm các phương thức đó – pandre

+0

Tôi khởi chạy màn hình này bằng UiApplication.getUiApplication(). PushModalScreen (new LoadingFullScreen()), nó có ảnh hưởng gì không? – pandre

Trả lời

4

Như không ai trong số các câu trả lời giải quyết vấn đề, tôi gửi bài ở đây các giải pháp tôi đạt được với sự giúp đỡ từ diễn đàn khác (http://supportforums.blackberry.com/t5/Java-Development/Application-is- không-đáp-process-chấm dứt-vì-of/mp/1234573 # M168285)

tôi không tìm thấy nó có liên quan, nhưng có vẻ như con đường tôi đã gọi LoadingFullScreen vấn đề:

public void fieldChanged(Field field, int context) { 
    LoadingFullScreen loading = new LoadingFullScreen(); 
    System.out.println("calling pushModalScreen"); //this was showing up in logs 
    UiApplication.getUiApplication().pushModalScreen(loading); 
    System.out.println("pushModalScreen done"); //this wasn't showing up in logs  
} 

nó hóa ra các trình giả lập/thiết bị mà tôi đã đề cập có hỗ trợ cho 'SureType'. "Điều đó có nghĩa là họ thực hiện một số điều khi bạn nhấn phím. Thông thường, họ sẽ cố gắng hiển thị 'lựa chọn' cho người dùng, bởi vì mỗi khóa có hai tùy chọn. ngăn chặn điều này. Và điều này tôi nghĩ là điều khiến nó khó chịu. "

Vì vậy, giải pháp là thay đổi cách này thay vì:

public void fieldChanged(Field field, int context) { 
    if (context != FieldChangeListener.PROGRAMMATIC) { 
     UiApplication.getUiApplication().invokeLater(new Runnable() { 
      public void run() { 
       LoadingFullScreen loading = new LoadingFullScreen(); 
       UiApplication.getUiApplication().pushModalScreen(loading);   
      } 
     } 
    } 
} 
4

Tôi nhớ rằng khi tôi đã gần như cùng một loại vấn đề. Bất cứ khi nào tôi cố gắng bật màn hình bằng cách khóa khóa chuỗi sự kiện, ứng dụng sẽ gặp sự cố. SO thay vì giữ (khóa) của chuỗi sự kiện, hãy thử đồng bộ hóa trên chuỗi sự kiện bằng cách sử dụng invokeLater().

UiApplication.getUiApplication().invokeLater(new Runnable() 
{ 
    public void run() 
    { 

    } 
}); 
+0

Cảm ơn câu trả lời. Tôi đã thử điều đó, nhưng tôi có cùng một vấn đề. Tôi đã chỉnh sửa bài đăng gốc để phản ánh rằng – pandre

+0

Tôi có thể đã sai với đề xuất này của tôi. Tôi không phải chuyên gia về Chủ đề. Nhưng nghĩ rằng điều này có thể là vấn đề Nhìn vào mã của bạn, tôi nhận thấy rằng bạn thực hiện Runnable trên lớp UI (FullScreen). Và bạn đẩy scree này bằng cách sử dụng ** UiApplication.getUiApplication(). PushModalScreen() **. Vì vậy, bạn LoadingFullScreen là trên bây giờ Chủ đề sự kiện. Khi màn hình được đẩy để hiển thị ngăn xếp, bạn tạo ra một chủ đề mới và đặt LoadFullSCreen runnable trên thread này mà sẽ thực hiện run(). Trong chủ đề này, bạn cố gắng để popScreen tạo ra chủ đề này. Tôi nghi ngờ một số vấn đề ở đây. – indusBull

+0

Tôi sẽ đề nghị tạo một lớp mới (một cái gì đó giống như ConnectNetwork) mà thực hiện Runnable. Cắt phương thức run() của LoadigFullScreen và dán nó vào lớp mới. Bây giờ đặt lớp runnable mới này vào chuỗi sẽ được tạo như bình thường. Một điều nữa, sử dụng ** onUiEngineAttached() ** thay vì onDisplay() và onUnDisplay(). Các phương pháp sau này đã không được chấp nhận từ các hệ điều hành gần đây. Tôi hy vọng đây là vấn đề. – indusBull

1

Giả sử smth là sai (giả sử có một lỗi RIM) với UiApplication.getUiApplication().popScreen() ở đây chỉ là một ý tưởng để thử:

Thay vì UiApplication.getUiApplication().popScreen(active); cố gắng gọi active.close().

+0

Xin chào, cảm ơn đề xuất. Tuy nhiên, tôi nhận được chính xác hành vi tương tự. Tôi đã chỉnh sửa bài gốc để phản ánh rằng – pandre

+0

Hm .. Tôi tin vào những gì MusiGenesis và bạn nói. Tuy nhiên điều này là rất bất ngờ với tôi. Tôi đã sử dụng thành công 'UiApplication.getUiApplication(). PopScreen()' trên Storms trong một vài năm. Có lẽ nên có một số điều kiện khác (mà ứng dụng của tôi không có) cho lỗi này để hiển thị. Hoặc có thể lỗi xuất hiện trên một số hệ điều hành cụ thể được xây dựng. –

0

tôi tin rằng điều này là do chủ đề ui và chủ đề ur được tạo không giao tiếp đúng cách. bạn có thể sử dụng mã sau đây.

UiApplication.getUiApplication().invokeLater(new Runnable() 
{ 
    public void run() 
    { 

    } 
}); 
+0

Cảm ơn lời khuyên, nhưng như tôi đã nói trong EDIT đầu tiên, tôi đã thử điều đó và nó không hoạt động – pandre

0

Tôi đã có vấn đề kỳ lạ tương tự với một màn hình sổ popup tôi thực hiện. Nó bật ra rằng tôi đã có 2 phương pháp khác nhau cố gắng để bật màn hình cùng một lúc. Điều này dẫn đến lỗi.

Tôi đã kết thúc việc tạo phương thức trợ giúp tĩnh mà giờ đây tôi sử dụng để đóng màn hình, kiểm tra xem màn hình có thực sự được hiển thị trước khi đóng màn hình hay không.

văn đây trong trường hợp nó giúp ai đó:

/** 
* Convenience method to request a screen to close & pop it from the display 
* stack. This method handles the UI threading issues. 
* 
* @param screen 
*  {@link Screen} to be closed. 
*/ 
public static void closeScreen(final Screen screen) 
{ 
    UiApplication.getUiApplication().invokeLater(new Runnable() 
    { 

     public void run() 
     { 
      if (screen.isDisplayed()) 
      { 
       screen.close(); 
      } 
     } 
    }); 
} 
0

tôi đã trải qua một cái gì đó tương tự như sau. Tôi có một callback (gọi từ một thread), trong đó xử lý xảy ra, và thông báo cho người sử dụng của dấu hiệu cho thấy chế biến qua Status và được sử dụng mã như thế này:

UiApplication.getUIApplication.invokeLater(new Runnable(){ 
    public void run(){ 
    Status.show("...."); 
    } 
}); 

Và đã nhận được gần lỗi giống hệt như OP.

tôi nhận ra sau đó, vì khi gọi lại đã được thực hiện nhiều lần, ALL những Runnable s đã được xếp hàng và do đó "Quá nhiều chủ đề" theo sau một vụ tai nạn tốt đẹp!

Giải pháp:

UiApplication.getUIApplication.invokeAndWait(new Runnable(){ 
    public void run(){ 
    Status.show("...."); 
    } 
}); 

Đó sẽ chặn cho đến khi hàng đợi sự kiện được xóa làm theo cách để biết thêm Status hiển thị.

Kể từ khi nó trên một sợi, nó không quan trọng và do đó một thỏa hiệp tốt đẹp.

Kết quả cuối cùng: Không có sự cố khó chịu hơn và không có thư giả trong nhật ký sự kiện.

Để OP: Bạn có thể phải cấu trúc lại một chút cách bạn thông báo cho người dùng cuối về thông báo xử lý logic UI để không làm cạn kiệt luồng phân luồng.

BTW, cần lưu ý - đây là trên BB 4.5 :)

Các vấn đề liên quan