2011-09-16 11 views
1

私は2つの競合する問題があります。状況AndroidリストビューAsyncTaskを使用したフィルタリング

は、私が変更にEditTextを経由してフィルタリングしようとしている大規模なリストビュー10K +アイテムを手に入れました。

エラー1

ANR keyDispatchingTimedOut error

私は(一度に合理的な継ぎ合わさ)UIスレッド上のフィルタリング操作を持っていた、と私はそれが一部の携帯電話上でのエラーを引き起こしているものであると仮定し.. 。

特にAsyncTask C用に作成されたエラー1

ためしようとしました修正私は、フィルタリングの世話をして、別のスレッドを持っているので、それは私がこれのためにバックグラウンドスレッドを使用しないでください私に言っていない、今だから私のフィルタ機能をエイリング...

/// <summary> 
    /// Implementation of Android AsyncTask to perform the StudentFiltering in background 
    /// </summary> 
    internal class FilterStudentsTask : AsyncTask 
    { 
     private Student[] _students; 
     private StudentList _outer; 
     private StudentListAdapter _adapter; 
     private string _filterText; 

     public FilterStudentsTask(StudentList outer, StudentListAdapter adapter, string filterText) 
     { 
      this._outer = outer; 
      this._adapter = adapter; 
      this._filterText = filterText; 
     } 

     protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params) 
     { 
      // filter the list 
      this._adapter.filterStudents(this._filterText); 
      return true; 
     } 

     protected override void OnPostExecute(Java.Lang.Object result) 
     { 
      // Notify adapter of Data Change (to trigger re-draw) 
      this._adapter.NotifyDataSetChanged(); 
      base.OnPostExecute(result); 
     } 
    } 

エラー2

操作の種類はUIスレッドでのみ発生します。

E/AndroidRuntime(9738): FATAL EXCEPTION: main 
E/AndroidRuntime(9738): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sur 
e the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131361885, class mapdroid.ColorFade 
ListView) with Adapter(class mapdroid.StudentList_StudentListAdapter)] 
E/AndroidRuntime(9738):  at android.widget.ListView.layoutChildren(ListView.java:1510) 
E/AndroidRuntime(9738):  at android.widget.AbsListView.onLayout(AbsListView.java:1260) 
E/AndroidRuntime(9738):  at android.view.View.layout(View.java:7175) 
E/AndroidRuntime(9738):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912) 
E/AndroidRuntime(9738):  at android.view.View.layout(View.java:7175) 
E/AndroidRuntime(9738):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
E/AndroidRuntime(9738):  at android.view.View.layout(View.java:7175) 
E/AndroidRuntime(9738):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
E/AndroidRuntime(9738):  at android.view.View.layout(View.java:7175) 
E/AndroidRuntime(9738):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1140) 
E/AndroidRuntime(9738):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
E/AndroidRuntime(9738):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(9738):  at android.os.Looper.loop(Looper.java:130) 
E/AndroidRuntime(9738):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
E/AndroidRuntime(9738):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(9738):  at java.lang.reflect.Method.invoke(Method.java:507) 
E/AndroidRuntime(9738):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
E/AndroidRuntime(9738):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
E/AndroidRuntime(9738):  at dalvik.system.NativeStart.main(Native Method) 
W/ActivityManager( 111): Force finishing activity MapDroid.MapDroid/mapdroid.StudentList 
W/ActivityManager( 111): Activity pause timeout for HistoryRecord{40670aa0 MapDroid.MapDroid/mapdroid.StudentList} 

これらのエラーは矛盾しているようですか?あなたはどうやって和解しますか?私はその問題はあなたができない、ここで

protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params) 
    { 
     // filter the list 
     this._adapter.filterStudents(this._filterText); 
     return true; 
    } 

だと思う

+0

あなたのXMLパーサにデータをSQLiteデータベースに挿入し、それを 'CursorAdapter'を使用して' ListView'にバインドすると考えましたか?これにより、より洗練されたコード、スレッドの問題、さらにはパフォーマンスが向上します。 –

答えて

1

はUIではないスレッドからApapterクラスをアクセスも。このようなことをしてみてください

protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params) 
    { 
     // filter the list 
     result = students.filterStudents(this._filterText); 
     return true; 
    } 


protected override void OnPostExecute(Java.Lang.Object result) 
     { 
      // Notify adapter of Data Change (to trigger re-draw) 
      this._adapter.SetItems(result); 
      this._adapter.NotifyDataSetChanged(); 
      base.OnPostExecute(result); 
     } 
関連する問題