0

나는 패킷이 도착했을 때이를 감지하는 패킷 청취자가 있으며이 경우에 ArrayAdapter 새로 고침이 필요합니다.이벤트 수신기에서 Android UI를 새로 고치는 방법은 무엇입니까?

Exception in packet listener: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

어떤 아이디어 : 문제는 내가 adapter.notifyDataSetChanged() 방법에 액세스하려고하면 예외가 발생한다는 것입니다?

+0

어디에서 adapter.notifyDataSetChanged()를 호출합니까? 그것은 UI 스레드가 아닌 다른 스레드에서 발생해야합니다. – darnmason

답변

0

응용 프로그램의 컨텍스트에 액세스 할 수있는 객체에있는 가정 :

당신은 Activity에있는 경우 :

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     adapter.notifyDataSetChanged(); 
    } 
}); 

당신은 Fragment에있는 경우 :

Activity act = getActivity(); 
if (act != null) { 
    act.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      adapter.notifyDataSetChanged(); 
     } 
    }); 
} 

기타 루퍼 (looper)/메시지 핸들러 (message handler)와 같은 옵션이 존재하지만 이것은 훨씬 간단합니다.

+0

문제는 UI 업데이트를 위해 이벤트가 발생한 후 adapter.notifyDataSetChanged()를 호출해야한다는 것입니다. 이런 이유로 UI를 업데이트하는 이벤트가 발생할 때를 알아야하지만 예외가 throw되기 때문에 리스너 내부에서 메서드를 호출 할 수 없습니다 ... – user3339544

+0

@ user3339544, 어떤 클래스가 어댑터입니까? 프래그먼트 나 액티비티에 있다고 가정하여 위의 과정을 수행하여 리스너 내부에서 메소드를 호출 할 수 있습니다. 다음에 다른 청취자가 있습니까? 그렇다면 UI 스레드에 대한 처리기를 가져와야합니다. 게시물을 청취자의 성격을 나타내는 몇 가지 코드로 업데이트하십시오. – Jared