2012-09-03 3 views
0

나는 ListActivity에 SMS ContentObserver을 가지고 있습니다. ListView은 SMS를 보내고받은 을 표시합니다. SMS 데이터베이스 (전송/수신)에 변경이있을 때마다 관찰자 은 ListView을 업데이트하는 Activity 내의 기능을 호출합니다.CalledFromWrongThreadException : 안드로이드 ContentObserver 및 활동 인터페이스

FROYO에서 잘 작동합니다. 견해를 만질 수있는 뷰 계층 구조를 생성 만 원래 스레드 :하지만 ICS에서 나는 다음과 같은

android.view.ViewRootImpl $ CalledFromWrongThreadException를 얻을.

문제의 원인을 알려주십시오.

다음은 최상위 코드입니다.

public class MyList extends ListActivity implements OnInitListener{ 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     MyList.this.getContentResolver() 
      .unregisterContentObserver(smsObserver); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     MyList.this.getContentResolver() 
      .unregisterContentObserver(smsObserver); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.MyList); 

     registerSmsEventObserver(); 
     updateList(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     registerSmsEventObserver(); 
    } 

    updateList() { 
     //fill up the listview 
    } 

    private void registerSmsEventObserver() {  
     if (smsObserver != null) 
      return; 

     smsObserver = new ContentObserver(null) {    
      public void onChange(boolean selfChange) { 
       updateList(); 
      } 
     }; 
     MyList.this.getContentResolver().registerContentObserver(
      Uri.parse("content://sms"), true, smsObserver); 
    } 
} 
+0

나는 관찰자 내에서 목록보기를 만질 수 없다고 말한다. 옵저버가 호출하는 함수도 보내주십시오 ('updateList()'). –

답변

3

하나는 단순히 ContentObserver 스레드 또 다른 스레드에서 updateList();를 호출하지 않습니다. 대신, 당신은 더 나은 당신은 ContentObserver 당신이 관찰자를 만드는 때문에 주 스레드의 루퍼에서 실행되는 onChange를 만들 것입니다

new Handler() 

을 통과 만들 수

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     updateList(); 
    } 
}); 
1

처럼 runOnUiThread();로 포장 것 주 스레드에서.