2009-10-08 31 views
5

Ứng dụng tôi hiện đang phát triển đang liên lạc với máy chủ và quá trình liên lạc chạy theo chủ đề riêng của nó. Có các cuộc gọi không đồng bộ - ví dụ như đăng nhập() và onLoginResponse().

thông tin đăng nhập() được gọi trong hoạt động chính và phản hồi cũng được xử lý trong hoạt động chính (onLoginResponse()). Trong phương pháp onLoginResponse() có phương pháp updateGUIState() mà sẽ thay đổi yếu tố định dạng:

private void updateGUIState() { 

    Log.i(TAG, "executing updateGUIState"); 

    arrangeLayoutElements(); 
    txtTime.setText(mStrRecordingTime); 
    if (settings.isRecording()) { 
     //btnAction.setText("Stop"); 
     btnAction.setImageResource(R.drawable.button_stop); 
    } else { 
     //btnAction.setText("Capture"); 
     btnAction.setImageResource(R.drawable.button_record); 
    } 

    //set privacy level text 
    if (settings.getPrivacyLevel() == 0) { 
     txtPrivacyLevel.setText("Private"); 
    } else if (settings.getPrivacyLevel() == 1) { 
     txtPrivacyLevel.setText("Public"); 
    } 

    if (settings.isMute()) { 
     muteIcon.setIconImage(R.drawable.ic_volume_off_small); 
    } else { 
     muteIcon.setIconImage(R.drawable.ic_volume_small); 
    } 

    if (mIsUploading) { 
     txtUploadingText.setVisibility(View.VISIBLE); 
     uploadingProgressBar.setVisibility(View.VISIBLE); 
    } else { 
     txtUploadingText.setVisibility(View.INVISIBLE); 
     uploadingProgressBar.setVisibility(View.INVISIBLE); 
    } 

    if (mEncoderConnection != null) { 
     txtConnectionStatus.setText("Connected"); 
    } else { 
     txtConnectionStatus.setText("Disconnected"); 
    } 
} 

Khi thực hiện đạt phương pháp này (khi gọi từ onLoginResponse()) các ứng dụng bị treo và các bản ghi sẽ hiển thị thông báo sau:

android.view.ViewRoot $ CalledFromWrongThreadException: Chỉ chuỗi ban đầu đã tạo phân cấp chế độ xem mới có thể chạm vào chế độ xem của nó.

Có ai biết cách sửa đổi logic để chuyển sang chuỗi thích hợp trước khi sửa đổi bố cục và khắc phục sự cố không?

Cảm ơn!

Trả lời

17

Hãy thử Handler.

Có phải onLoginResponse() là chức năng gọi lại không?
Nếu có, sự cố có thể được giải quyết bằng Trình xử lý.

Trong onLoginResponse(),

hRefresh.sendEmptyMessage(REFRESH); 


    Handler hRefresh = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
    switch(msg.what){ 
     case REFRESH: 
       /*Refresh UI*/ 
       updateGUIState(); 
       break; 
     } 
    } 
}; 
+0

Tôi ước rằng tôi đã tìm thấy câu trả lời này một thời gian dài, tôi đã gặp vấn đề tương tự và mất khoảng một tuần để tìm ra giải pháp, đó chính xác là những gì bạn đã đề cập đến – aryaxt

+0

Tôi tìm thấy ít nhất 5 câu trả lời khác nhau ngoại lệ. Chỉ có một người này làm việc cho tôi! –

3

updateGUIState() cần phải chạy trên chuỗi giao diện người dùng. Một giải pháp có thể là thực hiện cập nhật GUI của bạn trong một Runnable và gọi phương thức runOnUiThread với runnable của bạn.

0

Để thêm vào phản ứng bhatt4982, bạn cũng có thể gọi handler.post(onLoginThread), nơi onLoginThread là một Thread mà Runnable sẽ chạy bên trong thread GUI.

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