마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

프로그램이 갑자기 중지되는 이유를 모르겠어요.(IllegalStateException)

0 추천
/////여기까지 정상작동 키입력
D/AndroidRuntime(11210): Shutting down VM
W/dalvikvm(11210): threadid=1: thread exiting with uncaught exception (group=0x421e8700)
E/AndroidRuntime(11210): FATAL EXCEPTION: main
E/AndroidRuntime(11210): java.lang.IllegalStateException: The content of the adapter has changed but ListView did 
not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. 
 
[in ListView(2131230723, class android.widget.ListView) with Adapter(class com.example.makespinner.ItemAutoCompleteAdapter)]
E/AndroidRuntime(11210):  at android.widget.ListView.layoutChildren(ListView.java:1557)
E/AndroidRuntime(11210):  at android.widget.AbsListView.onLayout(AbsListView.java:2444)
E/AndroidRuntime(11210):  at android.view.View.layout(View.java:15204)
E/AndroidRuntime(11210):  at android.view.ViewGroup.layout(ViewGroup.java:4793)
E/AndroidRuntime(11210):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
E/AndroidRuntime(11210):  at android.view.View.layout(View.java:15204)
E/AndroidRuntime(11210):  at android.view.ViewGroup.layout(ViewGroup.java:4793)
E/AndroidRuntime(11210):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11210):  at android.view.View.layout(View.java:15204)
E/AndroidRuntime(11210):  at android.view.ViewGroup.layout(ViewGroup.java:4793)
E/AndroidRuntime(11210):  at com.android.internal.widget.ActionBarOverlayLayout.onLayout
 
(ActionBarOverlayLayout.java:349)
E/AndroidRuntime(11210):  at android.view.View.layout(View.java:15204)
E/AndroidRuntime(11210):  at android.view.ViewGroup.layout(ViewGroup.java:4793)
E/AndroidRuntime(11210):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11210):  at android.view.View.layout(View.java:15204)
E/AndroidRuntime(11210):  at android.view.ViewGroup.layout(ViewGroup.java:4793)
E/AndroidRuntime(11210):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2260)
E/AndroidRuntime(11210):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2007)
E/AndroidRuntime(11210):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
E/AndroidRuntime(11210):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6372)
E/AndroidRuntime(11210):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
E/AndroidRuntime(11210):  at android.view.Choreographer.doCallbacks(Choreographer.java:591)
E/AndroidRuntime(11210):  at android.view.Choreographer.doFrame(Choreographer.java:561)
E/AndroidRuntime(11210):  at android.view.Choreographer$FrameDisplayEventReceiver.run
 
 
----------------------------------
연락처를 받아와서검색해주는 어플인데요.
아주 불규칙하게 프로그램이 중지됩니다.
이거 왜이러는걸까요? 저는 다른 스레드를 만든적도 없습니다.
 
아래소스는 어댑터를 구현한것이구요.
class ItemAutoCompleteAdapter extends ArrayAdapter<Item> implements Filterable
{
  private ArrayList<Item> totalItem;
  private ArrayList<Item> resultList = new ArrayList<Item>();
  private Context context;
    
//....중략

  @Override
  public View getView(int position, View rowView, ViewGroup parent)
  {
	// reuse the rowView if possible - for efficiency and less memory consumption
	if (rowView == null)
	{	
	   LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	   rowView = inflater.inflate(R.layout.data_item, null);

	   ViewHolder viewHolder = new ViewHolder();
	   viewHolder.itemImage = (ImageView) rowView.findViewById(R.id.itemImage);
	   viewHolder.itemName = (TextView) rowView.findViewById(R.id.itemName);
	   viewHolder.itemDescription = (TextView) rowView.findViewById(R.id.itemDescription);
	   rowView.setTag(viewHolder);
	}

	ViewHolder holder = (ViewHolder) rowView.getTag();

	Item item = resultList.get(position);

	setItemImage(holder.itemImage, item.getItemPhotoUri());
	holder.itemName.setText(item.getItemName());
	holder.itemDescription.setText(item.getItemDescription());
		
	return rowView;
}
    
private ArrayList<Item> autocomplete(String input)
{
    //중략
}
    
@Override
public int getCount() { return resultList.size(); }
@Override
public Item getItem(int index) { return resultList.get(index); }

@Override
public Filter getFilter()
{
    Filter filter = new Filter()
    {
        @Override
        protected FilterResults performFiltering(CharSequence constraint
        {
            FilterResults filterResults = new FilterResults();       
            if(constraint == null )
            {
               notifyDataSetInvalidated();
               filterResults.values = null;
               filterResults.count = 0;
               return filterResults;
             }
                
             else if (constraint != null)
             {
                 // Retrieve the autocomplete results.
                 resultList = autocomplete(constraint.toString());
                    
                // Assign the data to the FilterResults
                 filterResults.values = resultList;
                 filterResults.count = resultList.size();
             }
             return filterResults;
         }

         @Override
         protected void publishResults(CharSequence constraint, FilterResults results)
         {
             if (results != null && results.count > 0)
             {
                 notifyDataSetChanged();
             }
             else
             {
                 notifyDataSetInvalidated();
             }
         }
     };
     return filter;
  }
}

도대체 어디가 불량인것일까요?.?

메인에서는 어댑터 설정하고

리스너 달아서 키입력시 getFilter.filter 호출해서 연락처 검색해주거든요..

안드로이드 공식홈에서 제공하는 소스를 최대한 이용했는데 왜그런걸까요...

능력자분들 도와주세요!!

천국의개발자 (120 포인트) 님이 2014년 3월 31일 질문

1개의 답변

+1 추천
올리신 코드와는 전혀 무관한 에라입니다~

비동기처리하는부분에 어댑터에 넣어주는 ArrayList가 변경사항이있다고 예외가뜨는건데

UIThread에서 처리하라고 나오는겁니다.

UIThread에서 네트워크로 받아온 데이터를 처리해주세요!
whdrb19 (23,520 포인트) 님이 2014년 3월 31일 답변
...