2009-10-08 22 views
5

現在開発中のアプリケーションはサーバーと通信しており、通信プロセスは独自のスレッドで実行されています。例えばlogin()やonLoginResponse()などの非同期呼び出しがあります。

メインアクティビティでlogin()が呼び出され、メインアクティビティ(onLoginResponse())でもレスポンスが処理されます。 onLoginResponse()メソッドにレイアウト要素を修正updateGUIState()メソッドがある:

:実行は、アプリケーションのクラッシュ(onLoginResponse()から呼び出された)この方法に到達し、ログには、次のメッセージが表示さ

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

android.view.ViewRoot $ CalledFromWrongThreadException:ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。

レイアウトを変更して問題を修正する前に、適切なスレッドに切り替えるためにロジックを変更する方法を知っている人はいますか?

ありがとうございます!

答えて

17

Try 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

私はこの回答を長い間見つけたかったと思います。私はまったく同じ問題を抱えていました。解決策を見つけ出すために1週間ほどかかりました。これは正確には何を言及したのですか? – aryaxt

+0

私は少なくとも5つの答えを見つけました例外。これだけが私のために働いた! –

3

updateGUIState()は、UIスレッドで実行する必要があります。可能な解決策は、GUI更新をRunnableに実装し、実行可能ファイルでrunOnUiThreadメソッドを呼び出すことです。

0

bhatt4982の応答に追加するには、あなたもonLoginThreadが実行可能なGUIスレッド内で実行されますThreadあるhandler.post(onLoginThread)を呼び出すことができます。

関連する問題