2009-10-08 12 views
5

एक आवेदन जो मैं वर्तमान में विकसित कर रहा हूं वह सर्वर से संचार कर रहा है और संचार प्रक्रिया अपने स्वयं के धागे में चलती है। असीमित कॉल हैं - उदाहरण के लिए लॉगिन() और onLoginResponse()।

लॉगिन() मुख्य गतिविधि में कहा जाता है और प्रतिक्रिया मुख्य गतिविधि में भी संभाली जाती है (onLoginResponse())। onLoginResponse() विधि में वहाँ updateGUIState() विधि जो लेआउट तत्वों को संशोधित करता है:

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"); 
    } 
} 

निष्पादन इस विधि अनुप्रयोग क्रैश हो जाता है (जब onLoginResponse() से कहा जाता है) तक पहुँच जाता है और लॉग निम्न संदेश प्रदर्शित करता है:

android.view.ViewRoot $ CalledFromWrongThreadException: केवल दृश्य धागा जिसने दृश्य पदानुक्रम बनाया है, उसके विचारों को स्पर्श कर सकता है।

किसी को भी पता है कि यह कैसे आदेश लेआउट को संशोधित करने से पहले उचित धागा करने के लिए स्विच और समस्या को ठीक करने में तर्क संशोधित करने के लिए संभव है?

धन्यवाद!

उत्तर

17

Handler आज़माएं।

onLoginResponse() एक कॉलबैक फ़ंक्शन है?
यदि यह है, समस्या हैडलर द्वारा हल किया जा सकता है।

onLoginResponse() में,

hRefresh.sendEmptyMessage(REFRESH); 


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

मैं मैं इस सवाल का जवाब एक लंबे समय के एक जाना, मैं ठीक उसी समस्या थी और मुझे एक सप्ताह के बारे में ले लिया समाधान यह पता लगाने की है, जो यू वास्तव में क्या उल्लेख किया है पाया इच्छा – aryaxt

+0

मैं इसके लिए कम से कम 5 अलग अलग जवाब मिल गया अपवाद। केवल यह मेरे लिए काम किया! –

3

updateGUIState() को UI थ्रेड पर चलाने की आवश्यकता है। एक संभावित समाधान Runnable में अपने जीयूआई अपडेट को लागू करना है, और अपने रननेबल के साथ runOnUiThread विधि को कॉल करें।

0

bhatt4982 की प्रतिक्रिया को जोड़ने के लिए, आप भी handler.post(onLoginThread) कॉल कर सकते हैं, जहां onLoginThread एक Thread जिसका runnable जीयूआई धागा अंदर चलेंगे है।

संबंधित मुद्दे