0

에서 실행되고 있지 notifyDataSetChanged :ArrayAdapter와는 내가 수행하여 만들 새 스레드 내에서 아래의 코드를 실행하고 UI 스레드

new Thread(new Runnable() { 
    public void run() { 
     // CODE BELOW 
    } 
}).start(); 

은 그래서 내 runonUI의 코드가 실행되고 있지 않습니다. 나는 어댑터를 업데이트하기 위해 UI 스레드에서 실행해야한다는 인상하에있다. 또한 어댑터를 올바르게 업데이트합니까?

Log.d(App.app.chats.toString(),"THIS IS THE TEXTS WE SHOULD DISPLAY"); 

((ArrayAdapter)App.app.chatDisplay.getAdapter()).clear(); 

for (int i = 0; i < App.app.chats.size(); i++) { 
    ((ArrayAdapter)App.app.chatDisplay.getAdapter()).add(App.app.chats.get(i)); 
} 

activity.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     Log.d("THIS IS ACTUALLY RUNNING","TEST"); 
     ((BaseAdapter)App.app.chatDisplay.getAdapter()).notifyDataSetChanged(); 
    } 
}); 
+1

이 runOnUiThread가 실행 된 적이없는 경우이 코드에 도달하지 않았을 가능성이 큽니다. 나는 전체 코드를 보면 더 말할 수 있습니다 ... – Mike

+0

@Mike가 말했듯이, 코드에는 결코 도달하지 못했습니다. 어쩌면 당신은 worker-thread 외부에서 runOnUIThread를 사용하고 있을까요? –

+0

위의 행이 실행되면 해당 runOnUi를 실행하는 데 필요한 명령이 있습니까? – user3089187

답변

0

질문을 올바르게 이해하면 ArrayAdapter을 배경 스레드에서 수정할 수 없습니다. clearadd 메서드 호출은 모두 내부적으로 notifyDataSetChanged을 호출합니다. 즉 notifyDataSetChanged 호출이 일종의 중복이며 해당 스레드가 심지어 runOnUiThread 행에 도달하기 전에 충돌하고 있음을 의미합니다.

신속한 해결 방법은 어댑터를 변경하기 전에 다음을 추가하는 것입니다.

((ArrayAdapter)App.app.chatDisplay.getAdapter()).setNotifyOnChange(false); 

그러면 내부 notifyDataSetChanged 호출이 비활성화됩니다. 수동으로 직접 호출하면 플래그가 재설정됩니다. 또한, ArrayAdapter은 그런 배경 스레드에서 돌연변이를 일으키려하지 않았습니다. 위의 해결 방법이 효과적 일 수는 있지만 이러한 mutate 메서드 호출을 UI 스레드로 옮기는 것이 좋습니다.

+0

알았어, 굉장해서 분명하고 추가 된 메소드가 내 스레드를 망가 뜨 렸어. 그래서 나는 그 스레드를 UI 스레드에 추가하고 알림을 제거했다. 고맙습니다! 나는 곤두박질 쳤다. 이해를 주셔서 감사합니다. 나는 어제 꽤 어 렸고 아마도별로 의미가 없었습니다. – user3089187